LOCATE LOCATE: DISPLAY DISPLAY CODESG
PROC
PUSH PUSH PUSH LEA DEC MUL ADD MOV CLD LEA REP POP POP POP RET ENDP PROC PUSH LEA MOV INT POP RET ENDP ENDS END
NEAR ; 将月份数字转换为英文缩写字母的子程序 SI DI CX
SI, MONTAB AL THREE SI, AX CX, 03 DI, ALFMON MOVSB CX DI SI
NEAR ; DX
DX, ALFMON AH, 09 21H DX
屏幕显示子程序
MAIN
(二)采用DOS功能调用设计源程序,并运行调试程序
1、十进制加法和结果显示程序(自行设计) 1)程序设计要求
将数据段DSEG中的ADDOP1定义的双字变量的4位十进制数和附加段ESEG中的ADDOP2定义的双字变量的4位十进制数相加,和存放于数据段DSEG中的SUM中,采用DOS显示功能调用将和显示在屏幕上。 2) 实验步骤: (1)建立源程序文件。
(2)用MASM宏汇编程序和LINK连接程序生成执行程序。
21
(3)运行执行程序,输入不同的加数和被加数,观察结果。
2、十进制加法和算式显示程序(自行设计) 1) 程序设计要求 在以上十进制数加法要求的基础上,将加法算式及和在显示器上显示。 如ADDOP1中存放1234H,在ADDOP2中存放6789H,执行程序后显示器上显示: 1234+6789=8023 2) 实验步骤: (1)建立源程序文件。
(2)用MASM宏汇编程序和LINK连接程序生成执行程序。 (3)运行执行程序,输入不同的加数和被加数,观察结果。
3、键盘输入加数和被加数进行十进制数加法,显示结果程序(自行设计) 1)程序设计要求 采用DOS的键盘功能调用和显示功能调用,将键盘输入的4位十进制被加数和4位加数相加,和存入有关内存单元,并将算式及和显示在显示器上。 要求采用子程序的设计方法设计程序,例如设计一个从键盘读入输入数据的子程序和将数据显示的子程序。
2)实验步骤:同上
(三)模块化程序设计
模块化程序设计是指将一个较大的功能分解成几个独立功能的子模块,每个子模块独立编缉各自建立一个文件,通过单独的汇编生成各个独立的目标文件,然后由LINK 程序将各个目标文件链接在一起,形成一个完整的执行文件。
1)实验程序的设计思想及其实现功能 程序实现键盘输入十进制数,以十六进制数形式在屏幕上显示的功能。程序分成两个模块,模块A为主程序,负责从键盘输入一个十进制数,处理后存入指定内存单元。模块B主要实现屏幕提示和将十六进制数转换及显示的功能。
实验程序参见教科书“微型计算机原理及应用”(吴宁主编)P185页上 模块化程序设计例1。
2) 实验步骤:
(1) 输入模块A程序和模块B程序,各产生一个文件。 (2) 汇编两个程序生成两个目标文件。
(3) 用LINK 文件名1+文件名2 命令链接为一个可执行文件。 (4) 运行程序,输入不同的十进制数,观察结果。
22
四、 思考题:
1、在实验(一)题3中,如输入01-12以外的数时将会出现什么结果?
2、如果输入非法的十进制数时,你所设计的实验(二)题3的程序是如何处理的?若无这种功能请增加提示、出错处理等功能,完善以上程序。
3、实验(三)的程序中是否对输入任何位的十进制数都能在屏幕上显示其十六进制数? 4、在实验(三)的程序中如果以回车键作为对输入数据的确认,程序应作什么修改?
五、试验报告要求
写出(二)1、2、3自行设计的采用DOS功能调用设计源程序的程序清单。
23
实验四 教材第4章习题程序设计
题目见教材第4章习题. 要求编程并调试通过,.
附录一 DEBUG 常用命令
DEBUG是为汇编语言设计的一种调试工具,它通过单步、设置断点等方式为汇编语言程序员提供了非常有效的调试手段。
6.1 DEBUG 程序的调用
在DOS的提示符下,可键入命令:
C>DEBUG[d: ][path]filename[.exe][parm1][parm2]
其中,文件名是被调试文件的名字。如用户键入文件名,则DUBUG将指定的文件装入存储器中,用户可对其经行调试。如果未键入文件名,则用户可以用当前存储器的内容工作,或者用DUBUG命令N和L把需要的文件装入存储器后再经行调试。命令中的d指定驱动器,path为路径,parm1和parm2则为运行被调试文件时所需要的命令参数。
在DUBUG程序调入后,将出现提示符,此时就可用DUBUG命令来调试程序。
6.2 DUBUG的主要命令
1)显示存储单元的命令D(DUMP),格式为: -D[address]或 -D[range]
例如,按指定范围显示存储单元内容的方法为:
—d100 120
18E4:0100 C7 06 04 02 38 01 C7 06—06 02 00 02 C7 06 08 02 G?8.G??G? 18E4:0110 02 02 BB 04 02 E8 02 00—CD 20 50 51 56 57 8B 67 ?;?h?MPQVW. 7
18E4:0120 8B
其中0100至0120是DUBUG显示的单元内容。左边用十六进制表示每个字节,右边用ASCII字符表
24
示每个,。表示不可显示的字符。这里没有指定段地址,D命令自动显示DS段的内容。如果只指定首地址,则显示从首地址开始的80个字节的内容。如果完全没有指定地址,则显示上一个D命令显示的最后一个单元后的内容。
2)修改存储单元内容的命令有两种。 .输入命令E(Enter),有两种格式如下:
第一种格式可以用给定的内容表来替代指定范围的存储单元内容。命令格式为: —E address [List]
例如,—E DS :100 F3’XYZ’8D
其中F3,’X’,’Y’,’Z’和8D各占一个字节,该命令可以用这五个字节来替代存储单元DS:0100到0104的原先的内容。
第二种格式则是采用逐个单元相继修改的方法。命令格式为: —E address 例如,—e cs :100 则可能显示为:
18E4:0100 89.—
如果需要把该单元的内容修改为78,则用户可以直接键入78,在按“空格”键可接着显示下一个单元的内容,如下:
18E4:0100 89.78 1B
这样,用户可以不断修改相继单元的内容,直到用Enter键结束该命令为止。
3)检查和修改寄存器内容的命令R(Register),它有三种格式如下: .显示CPU内所有寄存器内容和标志位状态,其格式为: —R 例如,
—r
AX=0000 BX=0000 CX=010A DX=0000 SP=FFFE BP=0000 SI=0000 DI=0000 DS=18E4 ES=18E4 SS=18E4 CS=18E4 IP=01OO NV UP DI PL NZ NA PO NC 18E4:0100C70604023801 MOV WORD PTR [0204],0138 DS:0204=0000
其中标志位状态的含义可见第二章表2.1。
.显示和修改某个寄存器内容,其格式为: —R register name 例如,键入
—r ax
系统将响应如下:
AX FIF4 :
即AX寄存器的当前内容为FIF4,如不修改则按Enter键,否则,可键入欲修改的内容,如:
—r bx BX 0369 : 059F
则把BX寄存器的内容修改为059F。
25