r 连查带改 reg
d只看不改 rom
e用机器码
a用ase
d只看不改 rom
e用机器码
a用ase
u 用ase翻译某段
t执行一句
t执行一句
g断点类似
p跳过
p跳过
所有segment只吃mov不吃add
mov ax,ds 正确
mov ds,立即数 错误
add ds,ax 错误
ds:[2] 正确,[2]错误,[bx]正确
cs:[2] 和 es:[2] 正确
cs:[bx] 和 es:[bx]正确
inc ds:[bx]错误(inc 不能接任何地址,但可以 inc byte ptr [bx])
cs:[2] 和 es:[2] 正确
cs:[bx] 和 es:[bx]正确
inc ds:[bx]错误(inc 不能接任何地址,但可以 inc byte ptr [bx])
不能 push+立即数
push必须接16位,不能al
push必须接16位,不能al
不能 jmp+立即数
and 寄存器,立即数/寄存器
不能mov 两个段寄存器
mov ds,al 正确
mov sp+立即数 中,立即数的值得大于16,即10H(原因不明)
偏移地址中 ,可以si/di+bx/bp+立即数,但si与di只能二选一,bx与bp也只能二选一
只写[bp]相当于 ss:[bp] 所以bp相当于sp
mov word//byte ptr ds:[0],1 ptr关键字指明内存单元长度 显性指明
dd === define double word
dup 重复定义的伪指令操作
db 3 dup(0) 定义了三个byte 全是0000h
db 3 dup(0,1,2) --->012012012
dec <-> inc
div使用:
div 除数(寄存器/字段)
若 除数为8位,则被除数是16位,为ax,结果4位商/余数, al为商,ah为余数
若 除数为16位,则被除数是32位,dx为高16位,ax为低16位,结果8位商/余数,ax商,dx为余数
若 除数为16位,则被除数是32位,dx为高16位,ax为低16位,结果8位商/余数,ax商,dx为余数
offset :
取得标号的偏移地址:
start:
mov ax.offset start ;相当于mov ax,0
s: mov ax,offset s ;相当于mov,ax,3
mov ax.offset start ;相当于mov ax,0
s: mov ax,offset s ;相当于mov,ax,3
(注意标号不能跳段)
jmp: jmp short 标号 ;8位 ;————(对应:mov ax 段名)
jmp near ptr 标号 ;16位,段内近转移
jmp near ptr 标号 ;16位,段内近转移
jmp far ptr 标号 :段间转移 直接修改cs:ip
jmp 16位寄存器
jmp word ptr 内存单元地址(段内转移):
从内存单元地址处开始存放一个字,是转移的目的的偏移地址
eg. jmp word ptr ds:[0]
从内存单元地址处开始存放一个字,是转移的目的的偏移地址
eg. jmp word ptr ds:[0]
jmp dword ptr 内存单元地址(段间转移):
功能:从内存单元地址处开始存放着两个字,高地址处的字是转移的目的段地址,低地址处是转移的目的偏移地址:
CS=内存单元地址+2
IP=内存单元地址
jmp dword ptr ds:[0]
jcxz指令:
有条件跳转指令,短转移,机器码中包含转移的位移大小(不是目的地址)
jcxz 标号
若 cx=0 ,则转移到标号处执行
当 cx=0时, IP=IP+8位位移("标号"处的地址-jcxz指令后的第一个字节的地址)
当cs!=0时,程序向下跳转执行
loop 短转移
每次都cx=cx-1
ret 指令用栈中的数据,修改IP的内容,从而实现近转移
IP=ss*16+sp
sp=sp+2
retf 指令用栈中的数据,修改CS和IP的内容,从而实现远转移
IP=ss*16+sp
sp=sp+2
cs=ss*16+sp
sp=sp+2
call指令经常跟ret指令配合使用:
(1)将当前的ip或cs、ip压入栈中
(2)转移(jmp)
call不能短转移,其他的等同于jmp
格式:
call 标号(将当前的ip压栈后,转到标号处执行指令)
sp=sp-2
ss*16+sp=ip
ip=ip+16位位移(标号的相对偏移)
call far ptr 标号:
sp=sp-2
ss*16+sp=cs
sp=sp-2
ss*16+sp=ip
cs=标号所在的段地址
ip=标号所在的偏移地址
ip=标号所在的偏移地址
call far ptr 标号 也相当于:
push CS
push IP
jmp far ptr 标号
push CS
push IP
jmp far ptr 标号
call 16位寄存器:
sp=sp-2
ss*16+sp=ip
ip=16位寄存器
ss*16+sp=ip
ip=16位寄存器
转移地址在内存中的call指令有两种格式:
call word ptr 内存单元地址
call dword ptr 内存单元地址
call dword ptr 内存单元地址
call word ptr 内存地址:
相当于——
push IP
jmp word ptr 内存单元地址
push IP
jmp word ptr 内存单元地址
mul 乘法指令:
相乘的两个数必须同是8位或同是16位
都是8位: 其中的默认的一个乘数为al的8位/内存字节单元,结果放在 ax中
都是16位,其中的默认的一个 乘数为ax的16位/内存字单元, 结果 高位放在dx,低位放在ax
都是16位,其中的默认的一个 乘数为ax的16位/内存字单元, 结果 高位放在dx,低位放在ax
格式
mul reg
mul 内存单元
mul 内存单元
mul byte ptr ds:[0]
含义为 ax=al*(ds*16+0)
含义为 ax=al*(ds*16+0)
mul word ptr[bx+si+8]
含义为:
含义为:
ax=(al)*((ds)*16+bx+si+8) 结果的低16位,而高十六位存在dx中
标志寄存器:
类似于psw (program status words)那种
flag寄存器构造:
0 CF:进位标志位,前一句指令最高位是否向更高位进了一位或者借了一位(无符号 ) Carry flag
2 PF:奇偶标志位 上一次结果的二进制表示方法中,如果有偶数个1,PF=1,如果有奇数个1,PF=0 Parity flag
4
6 ZF:零标志位 上一次结果不为0, 则ZF=0,上一次为0,则ZF=1 (运算指令如add会影响,但传送指令如mov之类的就不会)Zero flag
7 SF(s为segment中的seg):符号标志位,运算结果为负,则SF=1,结果为正,则SF=0 Sign flag
6 ZF:零标志位 上一次结果不为0, 则ZF=0,上一次为0,则ZF=1 (运算指令如add会影响,但传送指令如mov之类的就不会)Zero flag
7 SF(s为segment中的seg):符号标志位,运算结果为负,则SF=1,结果为正,则SF=0 Sign flag
8
9
10
11 OF: 溢出标志位(有符号):结果超过其所能表示的范围称为溢出,正常看是否因为进位影响了寄存器的符号位 Over flow flag
10
11 OF: 溢出标志位(有符号):结果超过其所能表示的范围称为溢出,正常看是否因为进位影响了寄存器的符号位 Over flow flag
debug中标志寄存器
标志 值为1的标记 值为0的标记
OF OV NV
SF NG PL
ZF ZR NZ
PF PE PO
CF CY NC
DF DN UP
OF OV NV
SF NG PL
ZF ZR NZ
PF PE PO
CF CY NC
DF DN UP
adc指令:带仅为的加法指令,它利用了CF位上记录的进位值
格式: adc 操作对象1,操作对象2
结果:操作对象1=操作对象1+操作对象2+CF
eg. adc ax,bx
ax=(ax)+(bx)+CF
ax=(ax)+(bx)+CF
CF前一句是sub,则是借位,若是add,则是进位
8086的加法:
低位相加
高位相加再加上CF在前一句的值
低位相加
高位相加再加上CF在前一句的值
即—— add ax,bx 等同于:
add al,bl
adc ah,bh
add al,bl
adc ah,bh
cmp ax,bx 指令过后:
如果 ZF=1 则二者相等,如果ZF=0,则二者不相等
如果 CF=1 ax<bx
如果 CF=0 ax>=bx(还得看ZF)
sbb 带借位的减法指令,它也利用了CF的值
sbb 操作对象1,操作对象2
功能: 操作对象1=操作对象1-操作对象2-CF
eg. sbb ax,bx
实现功能 ax=ax-bx-CF
cmp 是比较指令,功能相当于减法指令,只对flag产生影响,不保存结果。
cmp 操作对象1,操作对象2
功能 计算操作对象1-操作对象2,但并不保存结果,仅根据结果对flag进行设置(相当于用减法比较两个数大小)v
用cmp指令,看SF位,比较两个数的大小的方法,有缺陷
eg. ah=22h bh=0a0h
ah-bh=130=82h sf=1 然而ah>bh
所以需要同时看OF位
如果 SF=1 OF=0 所以是没有溢出的负数,所以逻辑上真正的结果也是负数
如果 SF=1 OF=1 说明有溢出,而逻辑上真正的结果的正负≠实际结果的正负,所以结果相反
如果 SF=1 OF=1 说明有溢出,而逻辑上真正的结果的正负≠实际结果的正负,所以结果相反
同理 SF=0 OF=1 则结果相反,左面的小
SF=0 OF=0 所以结果相同,左面的大
SF=0 OF=0 所以结果相同,左面的大
所以无符号的数的比较结果,检测ZF与CF的值
有符号数的比较结果,检测ZF,OF和ZF
有符号数的比较结果,检测ZF,OF和ZF
条件转移:
je 相等则转移 检测ZF=1 equal
jne 不等于则转移 检测ZF=0 not equal
jb 低于则转移 检测CF=1 below
jnb 不等于则转移 检测CF=0 not below
ja 高于则转移 检测CF=0,ZF=0 above
jna 不高于则转移 检测CF=1或ZF=1 not above
jne 不等于则转移 检测ZF=0 not equal
jb 低于则转移 检测CF=1 below
jnb 不等于则转移 检测CF=0 not below
ja 高于则转移 检测CF=0,ZF=0 above
jna 不高于则转移 检测CF=1或ZF=1 not above