分类: 信息化
2017-03-25 17:01:24
指令名称 |
汇编语句格式 |
功能 |
影响标志位 |
传送 move data |
mov opd, ops | (ops) → opd;分为主存储器、通用寄存器、段寄存器,不可同时使用主存储器,类型要匹配:byte,word,dword | 无 |
带符号扩充的传送 move with sign-extend |
movsx opd, ops |
将ops的符号向前扩展成与opd相同的数据类型后 → opd ops不能为立即数, |
无 |
带0扩展的传送 move with zero-extend |
movzx opd, ops | 将ops的高位向前补0扩展成与opd相同的数据类型后 → opd | 无 |
数据交换 exchange |
xchg opd, ops |
将(opd)与(ops)交换 源操作数不能是立即操作数 |
无 |
32位寄存器字节交换 byte swap |
bswap reg (reg,代表寄存器,下同) |
将从第一个与第四个字节交换,将第二个字节和第三个字节交换 (按字节反序),32位寄存器 |
无 |
交换并相加 exchange and add |
xadd opd, ops | 将(opd)与(ops)互换,(opd)+(ops) → opd |
af,of,pf, sf,zf,cf |
查表转换 table look-up translation |
xlat ops 或 xlatb |
(ds:[bx/ebx+al]) → al (求和之前al作无符号扩展), 一般把数表的首地址放到bx/ebx中,lea bx, buf ;al就是在buf中的位置 |
无 |
传送偏移地址 load effective address |
lea reg,ops | ops → reg | 无 |
传送偏移地址和数据段首地址 load data segment register |
lds reg, ops |
(ops)→ reg (ops+2/4)→ ds;ops一定是存储器地址,类型为dword/fword |
无 |
传送偏移地址和附加段首地址 load far pointer to extra segment |
les/lfs/lgs reg, ops | 同上,只是段寄存器分别为es,fs,gs | 无 |
传送偏移地址和堆栈首地址 load stack segment |
lss reg, ops | 同上,段寄存器为ss | 无 |
进栈 push word/dword onto stack |
push ops pushw ops 或pushd ops |
16位段:(sp) – 2/4 → sp (ops) → [sp]; 可以为两个字节, 或四个字节32位段:(esp) – 2/4 → esp (ops) → [esp]; 同上 |
无 |
所有16位通用寄存器进栈 pushall 16-bit general registers |
pusha | (sp/esp) –2 → sp/esp 重复8次压入ax,cx,dx,bx,sp(指令执前),bp,si,di;是先改变sp/esp 再把数据写入 | 无 |
所有32位通用寄存器进栈 pushall 32-bit general registers |
pushad |
(sp/esp) – 4 → sp/esp 重复8次压入eax,ecx,edx,ebx, esp(指令执行前),ebp,esi,edi;是先改变sp/esp 再把数据写入 |
无 |
出栈 pop a word/dword frome the stack |
pop opd |
16位段:[sp]→ (opd) ; (sp) + 2/4 → sp ;可以为两个字节,或四个字节 32位段:[esp]→ (opd) ; (esp) + 2/4 → esp ; 同上 |
无 |
出栈到所有16位通用寄存器 pop stack into all 16-bit registers |
popa |
将栈顶的16个字节依次出栈到di,si,bp,丢弃2个字节,bx,dx,cx,ax, (sp/esp)+16 → sp/esp |
无 |
出栈到所有32位通用寄存器 pop stack into all 32-bit registers |
popad |
将栈顶的16个字节依次出栈到edi,esi,ebp,丢弃4个字节,ebx,edx,ecx,eax, (sp/esp)+32 → sp/esp |
无 |
标志进栈 push flags onto stack |
pushf |
(sp/esp) – 2 → sp/esp (flags) → [sp/esp] |
无 |
扩展标志出栈 push eflags onto stack |
pushfd |
sp/esp – 4 → sp/esp (eflags) → [sp/esp] |
无 |
标志出栈 pop stack into flags |
popf |
[sp/esp] → flags sp/esp + 4 → sp/esp |
无 |
扩展标志出栈 pop stack into eflags |
popfd |
[sp/esp] → eflags sp/esp + 4 → sp/esp |
无 |
标志传送到ah load ah from flags |
lahf | (flags7-0) → ah | 无 |
将ah传送到flags store ah into flags |
sahf | (ah) → flags7-0 | sf,zf,af,pf,cf |
输入 input from port |
in opd, ops |
([ops]) → opd; opd只能是al、ax、eax;ops为立即数(<255)或者dx |
无 |
输出 output to port |
out opd, ops |
(ops) → [opd]; ops只能是al、ax、eax;opd为立即数(<255)或者dx |
无 |
指令名称 |
汇编语句格式 |
功能 |
影响标志位 |
加 1 increment |
inc opd | (opd) + 1 → opd |
af,of,pf, sf,zf |
加 addition |
add opd, ops | (opd) + (ops) → opd |
af,of,pf, sf,zf |
带进位加 add with carry |
adc opd, ops | (opd) + (ops) + cf → opd |
af,of,pf, sf,zf |
减 1 decrement |
dec opd | (opd) – 1 → opd |
af,of,pf, sf,zf |
求补 two's complement negation |
neg opd | 0 – (opd) → opd |
af,of,pf, sf,zf |
减 subtract |
sub opd, ops | (opd) – (ops) → opd |
af,of,pf, sf,zf |
带借位减 subtract with borrow |
sbb opd, ops | (opd) – (ops) – cf → opd |
af,of,pf, sf,zf |
比较 compare |
cmp opd, ops |
(opd) – (ops) 一般用于转移前的控制,应用于跳转 |
af,of,pf, sf,zf |
无符号乘 unsigned multiply |
mul ops |
字节乘:(al) * (ops) → ax; 字乘法:(ax) * (ops) → dx:ax; 双字乘:(eax) * (ops) → edx:eax |
cf,of |
单操作数的有符号乘 signed integer multiply |
imul ops |
字节乘:(al) * (ops) → ax; 字乘法:(ax) * (ops) → dx:ax; 双字乘:(eax) * (ops) → edx:eax |
cf,of |
双操作数的有符号乘 signed integer multiply |
imul opd, ops | (opd) * (ops) → opd;opd可为16/32的寄存器,ops可为同类型的寄存器、存储器或立即数 | cf,of |
三操作数的有符号乘 signed integer multiply |
imul opd, ops, n | (ops) * n → opd;同上,n为立即数 | cf,of |
将字节转换成字 convert byte to word |
cbw | 将al中的符号扩展到ah中,数据的补码数值没有变 | 无 |
将字转换成双字 convert word to double word |
cwd | 将ax中的符号扩展到dx的高位中 | 无 |
将字转换成双字 convert word to double word |
cwde | 将ax中的符号扩展到eax的高位中 | 无 |
将双字转换成4字 convert double word to quadword |
cdq | 将eax中的符号扩展到edx中 | 无 |
无符号除 unsigned divide |
div ops |
字节除:(ax)/(ops)→al(商),ah(余数);字除:(dx:ax)/(ops) → ax(商), dx(余数) 双字除: (edx:eax)/(ops) → eax(商),edx(余数) |
af,of,pf, cf,sf,zf |
有符号除 signed integer divide |
idiv ops |
字节除:(ax)/(ops)→al(商),ah(余数);字除:(dx:ax)/(ops) → ax(商), dx(余数) 双字除: (edx:eax)/(ops) → eax(商),edx(余数) |
af,of,pf, cf,sf,zf |
指令名称 |
汇编语句格式 |
功能 |
影响标志位 |
相等/等于0转移 jump if equal/zero |
je/jz 标号 | zf = 1 转移 | 无 |
不相等/不等于0转移 jump if not equal/zero |
jne/jnz 标号 | zf = 0 转移 | 无 |
为负转移 jump if sign |
js 标号 | sf = 1 转移 | 无 |
为正转移 jump if positive |
jns 标号 | sf = 0 转移 | 无 |
溢出转移 jump if overflow |
jo 标号 | of = 1 转移 | 无 |
无溢出转移 jump if not overflow |
jno 标号 | of = 0 转移 | 无 |
有进位转移 jump if carry |
jc 标号 | cf = 1 转移 | 无 |
无进位转移 jump if not carry |
jnc 标号 | cf = 0 转移 | 无 |
偶检验/偶性转移 jump if parity/parity even |
jp/jpe 标号 | pf = 1 转移 | 无 |
奇检验/奇性转移 jump if no parity/parity odd |
jnp/jpo 标号 | pf = 0 转移 | 无 |
小于/不大于也不等于 转移 jump if less/not greater nor equal |
jl/jnge 标号 | sf ≠ of 转移 | 无 |
不小于/大于或等于转移 jump if not less/greater or equal |
jnl/jge 标号 | sf = of 转移 | 无 |
大于/不小于或不等于转移 jump if greater/not less or not equal |
jg/jnle 标号 | sf = of, 且zf = 0 转移 | 无 |
不大于/小于或等于转移 jump if not greater /less or equal |
jng/jle 标号 | sf ≠ of 或zf = 1 转移 | 无 |
低于/不高于且不等于转移(无符号) jump if below/not above not equal |
jb/jnae 标号 | cf = 1 转移 | 无 |
不低于/高于或等于转移(无符号) jump if now below/above or equal |
jnb/jae 标号 | cf = 0 转移 | 无 |
高于/不低于且比等于转移(无符号) jump if above/not below nor equal |
ja/jnbe 标号 | cf = 0 且 zf = 0 转移 | 无 |
不高于/低于或等于 jump if not above/below or equal |
jna/jbe 标号 | cf = 1 或 zf =1 转移 | 无 |
无条件转移 jump unconditionally |
jmp opd |
相对转移:(opd)+ip/eip → ip/eip 近转移:(opd) → ip/eip 远转移:(opd) → ip/eip, (opd+2/4) → cs,或根据描述符决定 |
无 |
cx为0转移 jump if cx is zero |
jcxz 标号 或jecxz 标号 |
若(cx/ecx) = 0 转移 | 无 |
循环 loop |
loop 标号 或loopw/loopd 标号 |
(cx/ecx) – 1 → cx/ecx, 若(cx/ecx) ≠ 0 则转移 | 无 |
相等/为0循环 loop if equal/zero |
loope/loopz 标号 | (cx/ecx) – 1 → cx/ecx,若(cx/ecx) ≠ 0 且zf = 1 则转移 | 无 |
不相等/不为0循环 loop if not equal/not zero |
loopne/loopnz 标号 | (cx/ecx) – 1 → cx/ecx,若(cx/ecx) ≠ 0 且zf = 0 则转移 | 无 |
检查数组下标边界 check array index against bounds |
bound reg, ops | 若reg的索引值小于ops指定的下边界或大于ops指定的上边界,则变成5号异常 | 无 |
调用子程序 call a procedure |
call opd | 调用opd所指定的子程序(32位段的远调用时,CS被扩展成4字节后压栈) | 任务切换有影响,否则无 |
从子程序返回 return from procedure |
ret [n] n代表16位常量,[]表可选 |
从子程序返回到调用语句的下一个语句处,若n存在,则(sp/esp)+n → sp/esp;32位段远返回时,cs出栈时改变4字节的栈指针 | 无 |
中断调用 interrupt |
int n | (flags/eflags) 入栈,0→if,tf;(cs) 入栈;(4*n)→ip,(4*n+2)→cs或根据idt给eip,cs赋值 | 0→tf,if,返回时复原 |
溢出中断 interrupt if overflow |
into | (flags/eflags) 入栈,0→if,tf;(cs) 入栈;(4*n)→ip,(4*n+2)→cs或根据idt给eip,cs赋值;of=1时产生int 4 | 0→tf,if,返回时复原 |
中断返回 interrupt return |
iret 或iretd(32位段) 或iretf |
ip出栈,cs出栈,flags/eflags出栈,根据nt标志做相应的处理 | 都有影响 |