debug各种基础指令

debug可以理解为对汇编进行调试的一个程序。老师讲课是从基础的指令讲起,所以开始阶段我只是使用DOSBOX里的debug逐条输入语句,这种方法不是很方便,但对于了解debug的使用还是很有帮助的。

讲这以下指令之前,先说明一些英文缩写所代表的含义。
在汇编语言里面,我们可以直接使用寄存器存储数据,常用的寄存器有ax,bx,cx,dx这些寄存器都是十六位的,这十六位又分为高八位和低八位,如:ah指ax寄存器的高八位,这里的h表示"high",al指ax寄存器的低八位,l表示"low"。

AX:累加寄存器(accumulator)
BX:基址寄存器(base)
CX:计数寄存器(count)
DX:数据寄存器(data)
SP:堆栈指针,和SS配合使用
BP:基址指针
SI:源变址寄存器
DI:目的变址寄存器
IP:指令指针,IP指向的是当前需要去除的指令字节
CS:代码段(code segment)
SS:堆栈段(stack segment)
DS:数据段(data segment)
ES:附加段(extra segment)
ZF:零标志 ZF=0表示运算结果为0
OF:溢出标志 OF=1表示溢出
SF:符号标志 SF=1表示负数
DF:方向标志

注:上面列出的都是我在编程中常遇到的英文缩写,并不完整。汇编语言是一门靠近计算机底层的语言,所以有大量有关计算机组织和操作系统的内容,篇幅所限就不全部写出来了。这些英文缩写也不需要强行记下来,在编程过程中自然就能理解并记忆。

1.-r指令
r指令用于查看各个寄存器及符号位的值。
在debug中直接输入r即可查看各寄存器和符号位的值。

2.-a指令
输入汇编语句
使用方法为:a[起始地址],表示从起始地址开始输入汇编指令(起始地址可省略),输入结束之后直接按回车键即可。

上图就是使用a指令从073F:100到073F:106输入了三条指令

3.-g指令
g指令用于执行代码,可以选定执行代码的开始点和结束点。
使用方法为:g=起始地址,如果不设置起始和结束地址,那么程序会一直执行,直到遇到中止指令。在debug中地址的显示方式为段地址:偏移地址,这里的起始地址和结束地址都指的是偏移地址。如g=100 10A意为执行从CS:100一直到CS:10A的汇编指令。

使用g指令执行100~108之间的指令(不包含108),可以看到执行之后的结果,ax=0001,bx=0001(程序的功能是将ax与bx的和存储在ax中)。同时也能看到下一条要执行的指令为add [bx+si],al

4.-t指令
t用于单步执行代码,在调试过程中通常需要逐步执行程序,并查看每一步执行后的结果,此时可以使用t指令

如上图所示,首先我们使用a指令输入了三条语句(汇编语言里面的注释以;开头),然后使用t指令逐步执行汇编语句。每一次输入结束之后,我们可以看见各寄存器值的变化以及下一条要执行的语句。

;把ax和bx之和存储到ax中
mov ax,0
mov bx,1
add ax,bx

5.-u指令
用于查看反汇编
使用场景一般是要查看某个变量的内存地址,常与d指令配合使用(比如在程序执行完毕后,查看某个变量值是否发生变化,就可以先使用u指令找到该变量的地址,再使用d指令查看对应单元的值)
使用方式:直接输入u或者u 起始地址

同样使用上面的三条指令作为例子,这里我们没有定义独立的变量,所以使用u指令后看到的反汇编和我们输入的指令几乎没有差别。

6.-d指令
显示内存区域的内容
在程序运行结束后,查看运行的结果常用到这一指令
使用方式:直接输入d或者d[起始地址]
下面是不执行任何指令前内存区域的值(直接输入d)

7.-e指令
改变指定内存单元的内容
这条指令我用的不是很多,因为对于内存单元的修改可以在编写.asm文件时进行,用debug进行修改没那么方便。这里就不放图啦~

8.-q指令
退出debug
这条指令很简单,就是使用完毕debug之后想退出,直接输入q就行(其实我更多时候是直接暴力关闭dosbox😄)。


最后提前祝大家新年快乐!🎇

最后修改:2025 年 03 月 03 日
如果觉得我的文章对你有用,请随意赞赏