武汉理工大学《汇编语言程序设计》课程设计
1
《汇编语言程序设计》课程设计报告明细表
一、设计目的
二、设计环境与工具
三、设计任务
四、设计完成时间
五、程序设计算法说明
六、程序设计框图
七、源程序清单
八、运行结果
九、设计结果测试、分析、体会
武汉理工大学《汇编语言程序设计》课程设计
2
产生机关枪声
1 设计目的
a.通过该课程设计,熟悉操作系统的功能调用;
b.进一步了解汇编语言控制计算机硬件的方法;
c.提高汇编语言应用程序的设计能力。
2 设计环境与工具
DOS操作系统、文本编辑器,masm、link、debug
3 设计任务
产生机关枪声,枪声时间可控,由键盘输入控制值,按“Q”键退出。
4 设计完成时间
2005 年 12 月 31 日
5 程序设计算法说明
5.1 主程序设计
数据段说明:
freq dw 90 ;存放枪声频率
col db 0 ;
row db 0
time label byte ;接收用户输入的时间
t_max db 2
t_act db ?
t_fld db 2 dup(?)
key label byte ;存放用户输入的字符(a / q)
k_max db 2
k_act db ?
k_fld db 2 dup (?)
以下程序段用于设置屏幕大小及背景色:
武汉理工大学《汇编语言程序设计》课程设计
3
mov ah,00 ;320*200 彩色屏幕
mov al,04
int 10h
mov ah,0bh ;背景色
mov bh,00
mov bl,1
int 10h
枪声产生是调用 gensound 子程序,用循环结构,当用户输入期望产生的枪声次数后,
实际产生的枪声次数为用户输入值的 10 倍:
lea si,t_fld
mov al,[si] ;取用户输入的枪声控制值
sub al,30h
mov bl,10
mul bl ;乘以 10
mov cl,al ;送给 CX 以控制循环次数
5.2 产生声音子程序的设计
在 计 算 机 中 有 一 个 可 编 程 时 间 间 隔 定 时 器 8253/54 ( programmable interval
timer,PIT),它能根据程序提供的计数值和工作模式,产生各种形状和各种频率的计数/定时
脉冲,提供给系统的各个部件使用。
BIOS 中的 BEEP 子程序能根据 BX 中给出的计数值控制 8253/54 定时器,产生频率为
896Hz 的声音。该子程序的用途大当“加电自测”系统发现硬件错误后,由 ERROR_BEEP 处理
程序调用 BEEP 子程序,使扬声器发出“嘟嘟”的信号。BX 中计数值由 ERROR_BEEP 程序设置
为 533H,然后 BEEP 程序又将 8255 的输出寄存器(I/O 断口为 61H)的 PB0 和 PB1 置 1,使扬
声器接通并发出音频为 896Hz 的声音。
实际上 BEEP 是一个很好的通用发声程序,可以利用并修改 BEEP,使其产生任一频率的
声音。此时要做两点修改:首先,BEEP 程序只能产生 896Hz 的声音,通用发声程序应能产生
任一频率的声音。其次,BEEP 产生声音的持续时间(音长)只能是 0.5s 的倍数,而通用发
声程序希望声音的持续时间更易于调整。
5.2.1 机关枪声音的频率
武汉理工大学《汇编语言程序设计》课程设计
4
给计数器 2 装入计数值 533H 能产生 896Hz 的生音(1.1931MHz/896Hz=1331=533H),则产
生其他频率声音的计数值也可以用以下公式计算出来:
1193100/给定频率=12348CH/给定频率
使发声频率放在 DI 寄存器中,下面指令使 AX 中得到送往定时器 2 的计数值:
mov dx,12H
mov ax,348CH
div di
5.2.2 产生与 10ms 成倍数的时间延迟
以下程序用来产生与 10ms 成倍数的时间延迟:
mov bx,m ; m 为在 bx 中放入的倍数
wait: mov cx,2800
delay: loop delay ;loop 指令执行 m*2800 次,即 10ms 的 100 倍
dec bx
jnz wait
5.2.3 设计步骤
① 在 8586/54 中的 43 端口送入一个控制字 0B6H(10110110B),该控制字对定时器 2
进行初始化,使定时器 2 准备接受计数初值。
②在 8586/54 中的 42 端口(Timer2)装入一个 16 位计数值(533H*896/频率),以
建立将要产生的声音频率。
③把输出端口 61H 的 0、1 两位置 1,发出声音。
5.2.4 程序说明
该子程序只能产生 19~65535Hz 的声音,这个频率的下限 19Hz 是使除法不产生溢出
的最小 DI 值((dx)=12H=18d<19).其中上限 65535Hz 实际上是多余的,因为人们能听到
的最高音频约为 20000Hz。
5.3 不发声子程序的设计
机关枪发一声以后需要暂停一次,此子程序正是完成该功能的。该子程序和发声子程
序大致相同。仅需做三点修改:①不需要指定频率;②不需要对端口 42 和 43 送入数值;
③不需要对端口 61 置数。因此仅需进行寄存器的保存和对延迟时间的设计。
5.4 清屏子程序的设计
武汉理工大学《汇编语言程序设计》课程设计
5
5.4.1 控制光标
利用 INT 10H 的功能 2 设置光标位置。坐标位置的行号在 DH 寄存器中,列号设在 DL
中。如在 320*200 的显示方式中,坐标设在(0,0)是屏幕的左上角,(319,199)是屏
幕的右下角。BH 中包含被输出的页号,对单色显示器来说,页号总是 0。
5.4.2 清屏
INT 10H 功能 6 能使屏幕内容上卷指定的行,这个功能需要设置 7 个参数:
AL=上卷行数
AL=0 全屏幕为空白
BH=卷入行属性
CH=左上角行号
CL=左上角列号
DH=右下角行号
DL=右下角列号
该子程序多次调用,每当产生一串枪声之后都会调用该子程序。当 AL=0 时,实际完
成的工作是清除屏幕的功能,它将按 AL 中的 Blank 字符(0)使指定的窗口为空白。
6 程序框图
silent
保存寄存器
设置 bx
设置循环次 cx
数
cx=0?
Bx 减 1
bx=0?
N
N
Y
Y
还原寄存器
ret
评论0