Chinaunix首页 | 论坛 | 博客
  • 博客访问: 86657
  • 博文数量: 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标志做相应的处理 都有影响

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

上一篇:没有了

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

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