汇编-王爽第三版学习笔记
Debug 命令
- 查看、修改CPU中的寄存器内存:R命令
- 查看内存中的内容:D命令
- 修改内存中的内容:E命令(可以写入数据、指令,在内从中,他们实际上没有区别)
- 将内存中的内容解释为机器指令和对应的汇编指令:U命令
- 执行CS:IP修改的内存单元内容的指令:T命令
- 以汇编指令的形式向内存中写入指令:A命令
寄存器
reg(寄存器)的集合包括:
ax,bx,cx,dx,ah,al,bh,bl,ch,cl,dh,dl,sp,bp,si,di;
sreg(段寄存器)的集合包括:
ds,ss,cs,es;
- ax:16位累加器;bx:16位基址寄存器;
- cx:16位计数器;dx:16位数据寄存器;
- sp:16位堆栈指针寄存器
- bp:16位基址指针寄存器
- si:16位变址寄存器
- di:16位目的变址寄存器
- ds:数据段寄存器
- es:附加段寄存器
- ss:堆栈段寄存器
- cs:代码段寄存器
寻址
8086cpu中,只有这4个寄存器可以在"[…]"中来进行内存单元的寻址
比如下面的指令都是政确的:
mov ax,[bx]
mov ax,[bx+si]
mov ax,[bx+di]
mov ax,[bp]
mov ax,[bp+si]
mov ax,[bp+di]
下面的指令是错误的:
mov ax,[cx]
mov ax,[ax]
mov ax,[dx]
mov ax,[ds]
在[…]中,这4个寄存器可以单个出现,或者只能以4中组合出现:
bx+si;bx;di;bp+si;bp+di;
比如下面的指令是政确的:
mov ax,[bx]
mov ax,[si]
mov ax,[di]
mov ax,[bp]
mov ax,[bx+si]
mov ax,[bx+di]
mov ax,[bp+si]
mov ax,[bp+di]
mov ax,[bx+si+idata]
mov ax,[bx+di+idata]
mov ax,[bp+si+idata]
mov ax,[bp+di+idata]
下面的指令是错误的:
mov ax,[bx+bp]
mov ax,[si+di]
只要的[…]中使用寄存器bp,而指令中没有显性地给出段地址,段地址就默认在ss中。比如下面的指令:
mov ax,[bp] 含义:(ax)=((ss)*16+(bp))
mov ax,[bp+idata] 含义:(ax)=((ss)*16+(bp)+idata)
mov ax,[bp+si] 含义:(ax)=((ss)*16+(bp)+(si))
数据空间
看如下例子:
data segment
db 1
dw 1
dd 1
db 200 dup(0)
data ends
上例中:
db 表示1字节的数据空间
dw 表示2字节的数据空间
dd 表示4字节的数据空间
dup 表示重复初始值,200表示重复1个字节200次值为0的空间w欸
(div)除法
- 8位除数
参数:ax=>被除数,reg/ptr=>除数(8b)
结果:ah=>余数,ax=>商 - 16位除数
参数:dx=>被除数高16位,ax=>被除数低16位,reg/ptr=>除数(16b)
结果(16位除数):dx=>余数,ax=>商 - 解决除法溢出问题
参数:dx => 被除数高位,ax => 被除数低位,cx => 除数
结果:dx => 结果高位,ax => 结果低位,cx => 余数
(mul)乘法
- 8位乘数
参数:al=>乘数(8b),reg/ptr=>乘数(8b)
结果:ax(16b) - 16位乘数
参数:ax=>乘数(16b),reg/ptr=>乘数(16b)
结果:dx=>结果高位,ax=>结果低位