汇编笔记(1) 寄存器

时间:2021-10-04 01:00:15

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