有关debug汇编的一些基础和一个基本的例子分析!!!!
中间还介绍了一下在Window10下如何使用debug,仅供参考!
在debug下执行以下操作:
-a100
0AE9:0100 mov dl,1
0AE9:0102 mov ah,2
0AE9:0104 int 21
0AE9:0106 int 20
0AE9:0108
-u0100 0106
0AE9:0100 B201 MOV DL,01
0AE9:0102 B402 MOV AH,02
0AE9:0104 CD21 INT 21
0AE9:0106 CD20 INT 20
AX=0201 BX=0000 CX=0000 DX=0001 SP=FFEE BP=0000 SI=0000 DI=0000
DS=0AE9 ES=0AE9 SS=0AE9 CS=0AE9 IP=0100 NV UP EI PL NZ NA PO NC
0AE9:0100 B201 MOV DL,01
-n smile.com
-rcx
CX 0000
:8
-w
Writing 00008 bytes
D:>dir
Volume in drive D has no label.
Volume Serial Number is 190A-4238
Directory of D:\
2007-02-27 11:02
WINNT课堂上曾书写一个求12+22+……+102的示例程序(见后面附录),请改写该程序,实现求一些毫无规律的任意数的平方和。将这些数定义在内存中,假设这些数据都是字节型的非零无符号数(即1~255),请选用合适的Debug命令定义它们,约定数据值0作为结束标记。
1、 将结果放在数据寄存器中,请编写程序,并设计实验过程(用合适的debug命令),验证程序执行的正确性;
2、 若结果要求存放在内存中,请编写程序,并设计实验过程(用合适的debug命令),验证程序执行的正确性;
注:编写程序和定义初始数据、查看程序运行结果都在Debug下直接进行。每次运行程序时请改变这些平方和数据的值以及数据元素个数,以多方验证程序正确性。
提示:程序中需要用到寄存器间接寻址方式,示例语句: MOV SI, 0200
MOV BL, [SI]
附:示例程序
1、 在任务一中,你对结果的字长做过考虑吗?请重新审视你程序的正确性,阐述你的程序将在什麽情况下出错。
2、 假设有如下约束条件:一旦平方和结果超过16位字长,则报出错信息,在屏幕上显示字符串“Overflow Error!”,并停止计算终止程序。请在Debug下重新编写程序并调试,验证程序的正确性。
提示:判断结果超长可在加法指令之后,判断进位标志位CF的值,80X86指令集中条件转移指令JC或JB均可做到这点。
寄存器DX用来存储平方和
SI为指向内存地址的指针
寄存器AX和BX用来求平方和
MOV DX,0 //初始化dx
MOV SI,0200 //将si指向0200内存单元
MOV BL,[SI] //将si指向0200内存单元的值给寄存器bl
CMP BL,0 //比较bl和0,如果bl=0,停止求和
JZ 0116 //跳转到地址0116处继续执行命令
MOV AL,BL //bl的值给al
MUL BL //bl自乘求平方送入ax
ADD DX,AX //dx和ax求和,结果送入dx
INC SI //si地址自加一
JMP 0106 //跳转到地址0106
INT 20 //程序结束并返回dos
① 编写汇编程序
② 将要计算的数写入内存(0200),并查看内存中的数据
③ 运行程序,观察存入数据寄存器中的结果
观察运行后的数据寄存器中的值,可以看到DX=4E,同时对比内存中的数据:22+72+52=78,而78=4E(h)=4*16+14,故汇编程序正常运行,完成实验要求。
寄存器DX用来存储平方和
SI为指向内存地址的指针
寄存器AX和BX用来求平方和
MOV DX,0 //初始化dx
MOV SI,0200 //将si指向0200内存单元
MOV BL,[SI] //将si指向0200内存单元的值给寄存器bl
CMP BL,0 //比较bl和0,如果bl=0,停止求和
JZ 0116 //跳转到地址0116处继续执行命令
MOV AL,BL //bl的值给al
MUL BL //bl自乘求平方送入ax
ADD DX,AX //dx和ax求和,结果送入dx
INC SI //si地址自加一
JMP 0106 //跳转到地址0106
MOV SI,0300 //将si指向0300内存单元
MOV [SI],DX //将dx的值写入所指内存
INT 20 //程序结束并返回dos
① 编写汇编程序
② 将要计算的数写入内存(0200),并查看内存中的数据
③ 运行程序,观察存入内存中的结果
观察运行后的数据寄存器中的值,可以看到DX=6D,同时观察内存地址0300中数据同样也是6D,即将运算结果存入了内存,对比内存地址0200的数据:32+62+82=109,而109=4E(h)=6*16+13,故汇编程序正常运行,完成实验要求。
在任务一中,你对结果的字长做过考虑吗?请重新审视你程序的正确性,阐述你的程序将在什麽情况下出错?
该汇编程序的乘法操作借助于寄存器bl和al(均为8位),以及dx和ax(均为16位),当al和bl所对应的数超过28,或者结果超过216-1就会发生溢出,从而导致结果错误。
寄存器DX用来存储平方和
SI为指向内存地址的指针
寄存器AX和BX用来求平方和
MOV DX,0 //初始化dx
MOV SI,0200 //将si指向0200内存单元
MOV BL,[SI] //将si指向0200内存单元的值给寄存器bl
CMP BL,0 //比较bl和0,如果bl=0,停止求和
JZ 0116 //跳转到地址0116处继续执行命令
MOV AL,BL //bl的值给al
MUL BL //bl自乘求平方送入ax
ADD DX,AX //dx和ax求和,结果送入dx
JC 011F //判断是否溢出,溢出跳转到011f处继续执行
INC SI //si地址自加一
JMP 0106 //跳转到地址0106
MOV SI,0300 //将si指向0200内存单元
MOV [SI],DX //将dx的值写入所指内存
INT 20 //程序结束并返回dos
MOV DX,0128 //将0128内存单元中内容复制到寄存器dx
MOV AH,9 //DOS的09h功能调用
INT 21 //输出寄存器dx内的字符串
INT 20 //程序结束并返回dos
DB ’Overflow Error!$’//定义输出字符串
① 编写汇编程序
② 将要计算的数写入内存(0200),并查看内存中的数据(无溢出)
③ 运行程序,观察存入数据寄存器中的结果
④ 修改要计算的数写入内存(0200),并查看内存中的数据(有溢出)
⑤ 运行到0116(-g=0100 0116)计算出第一个数2的平方
⑥ 运行全部代码,查看运行情况
当数据没有溢出时,观察运行后的数据寄存器中的值,可以看到DX=7E,同时观察内存地址0300中数据同样也是7E,即将运算结果存入了内存,对比内存地址0200的数据:32+62+92=126,而126=7E(h)=7*16+14,故汇编程序正常运行,无报错。当数据会溢出时,即平方和最终结果会超过16位字长,对0200内存单元第一个2运算时,程序正常运行,当运行全部程序,则报出错信息,在屏幕上显示字符串“Overflow Error!”,并停止计算终止程序,经过验证,程序正常运行,完成实验要求。