汇编指令小本本
1、 数据传送指令
1.1 mov
传递指令
(1) CPU内部寄存器之间的数据传送,如:mov ah,al
(2) 立即数送至通用寄存器(非段寄存器)或存储单元,如:mov al,3 mov [bx],1234h
(3) 寄存器与存储器间的数据传送,如:mov ax,var mov ax,[bx]
注:都是从右向左传递
1.2 xchg
交换指令
xchg OPRD1,OPRD2 OPRD可以是通用寄存器或存储单元,但不包括段寄存器,不能同时是存储单元,不能有立即数
1.3 地址传送
lea
lea ax,[si+2]
lds
lds si,FARPOINTER ; 32位双字变量
les
les reg,oprd
2、 堆栈操作指令
2.1 push
进栈指令
push src # 把16位数据src压入堆栈。
2.2 pop
出栈指令
pop dst # 从堆栈弹出16位数据至dst
3、 标志性操作指令
标志性传送指令
3.1 LAHF
LAHF # 把标志寄存器的低8位(包括SF(7)、ZF(6)、AF(4)、PF(2)、CF(0))传送到AH指定位
3.2 SAHF
SAHF # 把寄存器AH的指定位送至标志寄存器低8位(包括SF(7)、ZF(6)、AF(4)、PF(2)、CF(0))
3.3 PUSHF
PUSHF # 把标志寄存器的内容(16位)压入堆栈。SP-=2
3.4 POPF
POPF # 把当前栈顶的一个字传送到标志寄存器。SP+=2
标志性位操作指令
(1) CLC(Clear Carry Flag): CF置0
(2) STC(Set Carry Flag): CF置1
(3) CMC(Complement Carry Flag): CF取反
(4) CLD(Clear Direction Flag): DF置0,执行串操作指令时,地址递增
(5) STD(Set Direction Flag): DF置1,执行串操作指令时,地址递减
(6) CLI(Clear Interrupt enable Flag) IF置0,使CPU不响应来自外部装置的可屏蔽中断,但对不可屏蔽中断和内部中断没有影响
(7) STI(Set Interrupt enable Flag) IF置1,可以响应可屏蔽中断
4、 加减运算指令
4.1 add
加法指令
add OPRD1,OPRD2 # OPRD1 + OPRD2
4.2 adc
加法另带 CF
add OPRD1,OPRD2 # OPRD1 + OPRD2 + CF
4.3 inc
自加 1
inc OPRD # OPRD + 1
4.4 sub
减法
sub OPRD1,OPRD2 # OPRD1 - OPRD2
4.5 sbb
多减一个CF
sbb OPRD1,OPRD2 # OPRD1 - OPRD2 - CF
4.6 dec
自减 1
dec OPRD # OPRD - 1
4.7 neg
对操作数取补
neg OPRD # 0 - OPRD
4.8 cmp
判断大小
cmp OPRD1,OPRD2 # 执行OPRD1 - OPRD2,但运算结果不运送到OPRD1,可以一下比较
5、 乘除运算指令
5.1 mul
无符号数乘法指令
mul OPRD # 将OPRD与AX或AL中的操作数相乘,结果保存在DX:AX中或AX中
5.2 imul
有符号数乘法指令
imul OPRD # 把乘数和被乘数均作为有符号数进行乘法运算。其余与mul类似
5.3 div
无符号除法指令
div OPRD # OPRD为除数,被除数存放在DX:AX或AX中,做除法,结果存放在DX:AX(DX存放余数,AX存放商)或AX(AH余数,AL商)。
5.4 idiv
有符号除法指令
idiv OPRD # 把除数和被除数看做有符号数做除法,其余与div类似
5.5 cbw
符号拓展指令
cbw # 把寄存器AL中的符号位扩展到寄存器AH
5.6 cwd
符号拓展指令
cbw # 把寄存器AX中的符号扩展到寄存器DX
6、 逻辑运算和位移运算指令
6.1 not
取反
not OPRD # 把操作数OPRD取反,然后送回OPRD
6.2 and
& 运算
and OPRD1,OPRD2 # 对两个操作数进行按位逻辑“与”运算,结果送到OPRD1中
6.3 or
|| 运算
or OPRD1,OPRD2 # 对两个操作数进行按位逻辑“或”运算,结果送到OPRD1中
6.4 xor
^ 运算
xor OPRD1,OPRD2 # 对两个操作数进行按位逻辑“异或”运算,结果送到OPRD1中
6.5 test
检测某些位是否为1
test OPRD1,OPRD2
一般位移指令
6.6 sal/shl
左移
sal OPRD,m
shl OPRD,m # 把操作数OPRD左移m位,每移动一位,右边用0补足1位,移出的最高位进入标志位CF
6.7 sar
右移
sar OPDR,m # 操作数右移m位,同时每移1位,左边的符号位保持不变,移出的最低位进入标志位CF
6.8 shr
右移
shr OPRD,m # 操作数右移m位,同时每移1位,左边用0补足,移出的最低位进入标志位CF
循环位移指令
6.9 rol\ror\rcl\rcr
这些指令只影响CF和OF
rol OPRD,m
ror OPRD,m
rcl OPRD,m
rcr OPRD,m
7、 转移指令
7.1 jmp
jmp OPRD # 使控制指令无条件转移到OPRD的内容给定的目标地址处。操作数OPRD可以是通用寄存器,也可以是字存储单元
jmp far ptr 标号 # 使控制指令无条件的转移到标号对应的地址处
jmp OPRD # 使控制指令无条件转移到操作数OPRD的内容给定的目标地址处。操作数OPRD必须是双字存储单元
7.2 loop
计数循环指令
loop 标号 # 使转移标号与Loop指令间的指令循环执行CX次
7.3 loope/loopz
等于/全零循环指令
loope 标号
loopz 标号
# 该指令使CX自减1,若结果不为0,并且ZF=1,则转移至标号,否则顺序执行。注意指令本身实施的CX自减1操作不影响标志
7.4 loopne/loopnz
不等于/非零循环指令
loopne 标号
loopnz 标号
# 该指令使CX自减1,若结果不为0,并且ZF=0,则转移至标号,否则顺序执行。注意指令本身实施的CX自减1操作不影响标志