掌握汇编语言上机调试的重要性

2025-11-28 02:56:36

1、         为了便于大家理解,以及直观体现汇编的调试过程。首先我们看一段程序,从中可以看出调试对于程序员的重要性。下面一段代码要实现的功能是:把数据段中的串string1传送到附加段的string2中。

2、data segment      ;定义数据段

string1 db ‘assembly language’

data ends

extra segment      ;定义附加段

string2 db 17 dup(?)

extra segment

code segment      ;定义代码段

main proc far

assume cs:code,ds:data,es:extra

start:

push ds

xor ax,ax      ;ax寄存器清零,作用同sub ax,ax一样

push ax

mov ax,data     ;把数据段地址装入ds寄存器

mov ds,ax

mov ax,extra     ;把附加段地址装入es寄存器

mov es,ax

lea si,string1     ;把源串首址装入si寄存器

lea di,string2     ;把目的串首址装入di寄存器

mov cx,17     ;把字符串长度装入cx寄存器

cld       ;清方向标志,在串处理时,地址自动增加

rep movsb     ;重复串传送操作,重复次数放在cx中

ret

main endp

code ends

end start

3、      假设上述代码经编译、连接后生成的可执行文件是example.exe

1、 在DOS提示符下键入debug命令。

d:\masm>debug example.exe

      这时候就显示提示符-,就可在这个短线后输入debug命令。

4、 u 反汇编命令

指令使用方法:-u [起始地址 终止地址];上面方括号里的内容是可选的。他的作用是将机器代码反汇编成汇编指令;键入u后显示信息如下:

掌握汇编语言上机调试的重要性

5、       最左边给出的程序的段地址:偏移地址,即CS:IP值,右边是汇编语言指令,中间是汇编语言指令对应的机器语言指令。注意:调试程序默认的数制是十六进制。

6、 g 设置断点命令

假如我们把断点设在CS:IP=141D:0004。在debug提示符-下键入g4(g和4之间可以有空格,也可以没有空格)结果如下:

掌握汇编语言上机调试的重要性

7、       程序停在断点处,并显示出所有寄存器以及各标志位的当前值,最后一行给出下一条将要执行指令的地址、机器语言指令及汇编语言MOV AX,1419。我们可以从显示的寄存器的内容来了解程序运行是否正确。从图中可以看出各个段的16位段基地址值,如(DS)=1419H,(ES)=141BH,(SS)=1419H,(CS)=141DH。

8、 t 单步执行命令

        g命令设置了断点之后,从这个断点开始,每键入一次t命令,就按顺序执行一条指令,这样我们就可以跟踪程序的运行。通过查看寄存器和存储单元的内容,有利于查找程序中的算法错误或逻辑错误。

       键入单步调试命令,运行结果如下:

掌握汇编语言上机调试的重要性

9、      可以看出,AX寄存器中原来的数0000已经被新的数1419替换了。下一条即将执行的指令是MOV DS,AX,我们继续执行单步调试命令。

继续执行单步调试命令:

掌握汇编语言上机调试的重要性

10、      可以看出,DS寄存器中原来的数1409已经被新的数1419替换了。我们继续执行单步调试命令,程序就可以一步一步地往下执行。

11、   d 显示存储单元的内容命令

对于我们这个程序,由于它是要求把存储器数据段中的一串字符传送到附加段中,所以单从寄存器或在DOS提示符下键入可执行文件名是看不到运行结果的,因而需要用d命令分别查看数据段和附加段的有关区域的内容。

使用方法:-d 段基址:偏移地址

程序在DOS中显示的内容:如果我们要查看数据段内0偏移地址开始的存储单元的内容,可以键入如下的命令(假设程序已运行到RET指令处,即CS:IP=141D:001C ):

掌握汇编语言上机调试的重要性

12、       最左边是数据段基地址:偏移量,中间是存储单元的内容,每行为16个字节,为一个小段(Paragraph),最右边为对应的ASCII码,不能显示的ASCII字符以点号显示。

      可以看出,我们定义的字符串已显示在数据段开始的存储单元中,字符串的首地址就是位于数据段0偏移处。该图显示的是串操作结束之后的结果。

       从图的右边我们还可以看出,在数据段偏移地址0020H处又存放着同样的字符串,我们在数据段中只定义了一次,为什么在这里却显示了两次呢?原来1419:0020的地址恰恰就是附加段的首地址,1419:0020转换成物理地址是1419×10+0020=141B0H,而附加段的首地址是141B:0000转换成物理地址是141B×10+0000=141B0H,二者相等,从这里也可以看出,经过串移动操作后,数据段中的串已成功的移到了附加段中,这还可以从下面看出。

        如果我们要查看附加段内0偏移地址开始的存储单元的内容,可以键入如下的命令:

掌握汇编语言上机调试的重要性

13、       同样,最左边是附加段基地址:偏移量,中间是存储单元的内容,每行为16个字节,为一个小段(Paragraph),最右边为对应的ASCII码,不能显示的ASCII字符以点号显示。

从图的最右边可以看出,经过是串移动操作结束之后,数据段中的字符串已成功的移到了附加段中。

14、r 显示寄存器内容命令

语法格式:r [寄存器名]

      方括号中寄存器名是可选的,如果没有键入寄存器名,则显示所有寄存器的内容。

(1) 显示全部寄存器的内容,可键入如下命令:

掌握汇编语言上机调试的重要性

15、(2) 显示ax寄存器的内容,可键入如下命令:

掌握汇编语言上机调试的重要性

16、      最后一行的冒号提示以新的值替换ax中原有的值。如果输入1234后ax的内容变为1234H,结果如下:

掌握汇编语言上机调试的重要性

17、q 退出命令

   结束debug运行环境,回到DOS提示符。

声明:本网站引用、摘录或转载内容仅供网站访问者交流或参考,不代表本站立场,如存在版权或非法内容,请联系站长删除,联系邮箱:site.kefu@qq.com。
猜你喜欢