Debug汇编初步(Window10使用Debug)

Debug汇编初步(Window10使用Debug)

有关debug汇编的一些基础和一个基本的例子分析!!!!
中间还介绍了一下在Window10下如何使用debug,仅供参考!

熟悉debug工具的使用及DOS系统功能调用。

在debug下执行以下操作:

  1. 汇编(-a100)
  2. 运行(-g)
  3. 反汇编(-u100 106)
  4. 查看寄存器的值(-r)
  5. 用N命令对该程序命名(-n)
  6. 用W命令将该程序写入(Write)磁盘中(-r bx)
  7. 用DOS的dir命令查看当前目录下的文件

启动debug程序

(以Windows 10为例)
  1. 下载好DOSBox和debug
  2. 安装好DOSBox,运行DOSBox
  3. 运行界面如下
    Debug汇编初步(Window10使用Debug)_第1张图片
  4. 然后将debug程序放到D盘
  5. 输入 mount c d:\ 把物理D盘挂载到c盘符
  6. 输入c:\进入磁盘
  7. 执行debug命令按回车,然后输入R回车,进入debug命令操作界面
    Debug汇编初步(Window10使用Debug)_第2张图片

这里是一个简单的栗子

二、汇编程序

-a100
0AE9:0100 mov dl,1
0AE9:0102 mov ah,2
0AE9:0104 int 21
0AE9:0106 int 20
0AE9:0108

三、运行该程序

-g=0100 0106

Debug汇编初步(Window10使用Debug)_第3张图片

四、反汇编列出该程序

-u0100 0106
0AE9:0100 B201 MOV DL,01
0AE9:0102 B402 MOV AH,02
0AE9:0104 CD21 INT 21
0AE9:0106 CD20 INT 20

五、查看寄存器的值(-r)

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
Debug汇编初步(Window10使用Debug)_第4张图片

六、用N命令对该程序命名(-n)

-n smile.com

七、用W命令将该程序写入(Write)磁盘中(-rbx)

-rcx
CX 0000
:8
-w
Writing 00008 bytes

八、退出debug

-q
D:>
Debug汇编初步(Window10使用Debug)_第5张图片

九、用DOS的dir命令查看当前目录下的文件

D:>dir
Volume in drive D has no label.
Volume Serial Number is 190A-4238

Directory of D:\

2007-02-27 11:02

WINNT
2007-02-27 11:25 Documents and Settings
2007-02-27 11:34 Program Files
2007-02-27 14:28 KAV2003
2007-09-23 21:05 8 SMILE.COM
1 File(s) 8 bytes
4 Dir(s) 378,183,680 bytes free

十、在DOS下直接运行该程序,输入smile并回车

D:>smile

D:>
Debug汇编初步(Window10使用Debug)_第6张图片

任务一

课堂上曾书写一个求12+22+……+102的示例程序(见后面附录),请改写该程序,实现求一些毫无规律的任意数的平方和。将这些数定义在内存中,假设这些数据都是字节型的非零无符号数(即1~255),请选用合适的Debug命令定义它们,约定数据值0作为结束标记。
1、 将结果放在数据寄存器中,请编写程序,并设计实验过程(用合适的debug命令),验证程序执行的正确性;
2、 若结果要求存放在内存中,请编写程序,并设计实验过程(用合适的debug命令),验证程序执行的正确性;
注:编写程序和定义初始数据、查看程序运行结果都在Debug下直接进行。每次运行程序时请改变这些平方和数据的值以及数据元素个数,以多方验证程序正确性。
提示:程序中需要用到寄存器间接寻址方式,示例语句: MOV SI, 0200
MOV BL, [SI]
附:示例程序
Debug汇编初步(Window10使用Debug)_第7张图片

任务二

1、 在任务一中,你对结果的字长做过考虑吗?请重新审视你程序的正确性,阐述你的程序将在什麽情况下出错。
2、 假设有如下约束条件:一旦平方和结果超过16位字长,则报出错信息,在屏幕上显示字符串“Overflow Error!”,并停止计算终止程序。请在Debug下重新编写程序并调试,验证程序的正确性。
提示:判断结果超长可在加法指令之后,判断进位标志位CF的值,80X86指令集中条件转移指令JC或JB均可做到这点。

实验结果及分析:

一、任务一

1.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
  INC SI            //si地址自加一
  JMP 0106          //跳转到地址0106
  INT 20            //程序结束并返回dos

Debug运行

① 编写汇编程序

Debug汇编初步(Window10使用Debug)_第8张图片

② 将要计算的数写入内存(0200),并查看内存中的数据

Debug汇编初步(Window10使用Debug)_第9张图片

③ 运行程序,观察存入数据寄存器中的结果

Debug汇编初步(Window10使用Debug)_第10张图片

分析结果:

观察运行后的数据寄存器中的值,可以看到DX=4E,同时对比内存中的数据:22+72+52=78,而78=4E(h)=4*16+14,故汇编程序正常运行,完成实验要求。

1.2结果放在内存中改写代码及注释

寄存器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

Debug运行

① 编写汇编程序

Debug汇编初步(Window10使用Debug)_第11张图片

② 将要计算的数写入内存(0200),并查看内存中的数据

Debug汇编初步(Window10使用Debug)_第12张图片

③ 运行程序,观察存入内存中的结果

Debug汇编初步(Window10使用Debug)_第13张图片

分析结果:

观察运行后的数据寄存器中的值,可以看到DX=6D,同时观察内存地址0300中数据同样也是6D,即将运算结果存入了内存,对比内存地址0200的数据:32+62+82=109,而109=4E(h)=6*16+13,故汇编程序正常运行,完成实验要求。

二、任务二

2.1问题一

在任务一中,你对结果的字长做过考虑吗?请重新审视你程序的正确性,阐述你的程序将在什麽情况下出错?
该汇编程序的乘法操作借助于寄存器bl和al(均为8位),以及dx和ax(均为16位),当al和bl所对应的数超过28,或者结果超过216-1就会发生溢出,从而导致结果错误。

2.2实现报错的改写代码及注释

寄存器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!$’//定义输出字符串

Debug运行

① 编写汇编程序

Debug汇编初步(Window10使用Debug)_第14张图片

② 将要计算的数写入内存(0200),并查看内存中的数据(无溢出)

Debug汇编初步(Window10使用Debug)_第15张图片

③ 运行程序,观察存入数据寄存器中的结果

Debug汇编初步(Window10使用Debug)_第16张图片

④ 修改要计算的数写入内存(0200),并查看内存中的数据(有溢出)

Debug汇编初步(Window10使用Debug)_第17张图片

⑤ 运行到0116(-g=0100 0116)计算出第一个数2的平方

Debug汇编初步(Window10使用Debug)_第18张图片

⑥ 运行全部代码,查看运行情况

Debug汇编初步(Window10使用Debug)_第19张图片

分析结果:

当数据没有溢出时,观察运行后的数据寄存器中的值,可以看到DX=7E,同时观察内存地址0300中数据同样也是7E,即将运算结果存入了内存,对比内存地址0200的数据:32+62+92=126,而126=7E(h)=7*16+14,故汇编程序正常运行,无报错。当数据会溢出时,即平方和最终结果会超过16位字长,对0200内存单元第一个2运算时,程序正常运行,当运行全部程序,则报出错信息,在屏幕上显示字符串“Overflow Error!”,并停止计算终止程序,经过验证,程序正常运行,完成实验要求。

你可能感兴趣的:(深入理解计算机系统)