Chinaunix首页 | 论坛 | 博客
  • 博客访问: 89537
  • 博文数量: 18
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 118
  • 用 户 组: 普通用户
  • 注册时间: 2017-03-25 16:28
个人简介

***

文章分类

全部博文(18)

文章存档

2017年(18)

我的朋友

分类: 信息化

2017-03-25 17:01:24

转载: http://www.cnblogs.com/hustlijian/archive/2011/07/02/2096520.html

一、数据传送指令

指令名称

汇编语句格式

功能

影响标志位

传送
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标志做相应的处理 都有影响

阅读(1992) | 评论(0) | 转发(0) |
0

上一篇:没有了

下一篇:汇编语言命令速查

给主人留下些什么吧!~~