Debug
r:查看当前所有寄存器的值;也可以通过r <寄存器名称>来修改寄存器的内容。
d:查看内存内容,例如 -d 1000:0 8 查看段地址为1000,偏移地址为0,8个字节长度的内存内容。
e:直接修改内存内容:16进制
u:也是查看内存内容,但是会翻译成汇编指令显示出来,而不是16进制内容
a:直接修改内存内容:汇编指令
t:单步执行指令
p:跳出循环,比如loop和系统终端,也可以通过g指定一个偏移地址来直接执行到某个指令。
寄存器
CS:代码段地址,通过与IP(偏移地址)的配合形成20位的实际代码物理地址。CS:IP指向CPU当前执行的指令。
DS:数据段地址,通过手动指定偏移地址共同确定数据的物理地址;DS不能直接设置,需要通过其他寄存器来进行赋值。
SS:SP确定栈顶位置;push和pop指令执行时会根据SS:SP去确定栈顶位置。CPU不知道栈满和栈空,需要程序员自己管理。
CX:存放循环次数,与loop指令配合使用。
编程注意
MASM中的数值默认是十进制,如果要写16进制的必须用0开头或者h结尾,十六进制的2000要写成2000h。
debug中都是十六进制的,所以可以直接写十六进制数值就行了,例如2000,
[bx]
在debug中可以通过
mov ax,[0]
来读取内存中的内容到寄存器。但是在MASM只能通过下面这样才可以:
mov bx,0 mov ax,[bx]
或者下面这样也行:
mov ax,ds:[0] mov bx,ds:[1] mov cx,ds:[2] mov dx,ds:[3]
代码示例
;计算0ffff:0 ~ 0ffff:b十二个字节单元的内存值的和,存放到dx中
assume cs:code code segment ;代码段,code是代码端的名称。一个程序可以有很多代码段 start:mov ax,0ffffh mov ds,ax ;往ds中写数据需要借助其他寄存器,ds:数据段地址 mov dx,0 mov cx,12 ;cx存放的是loop循环的次数 s:mov bx,0 ;s为标号 loop可跳转到标号 mov al,[bx] mov ah,0 add dx,ax inc bx loop s ;每次循环完之后会自己递减cx,直到cx为0 mov ax,4c00h ;这两句是标准的程序退出语句 int 21 code ends ;代码段结束 end start ;end为程序结束,start为程序入口
安全空间
0:200 ~ 0:2ff