汇编基础

(本文更新ing...)

0. 一些命令

汇编命令 等价伪代码
mov eax, ecx eax=ecx
add eax, ecx eax+=ecx
sub eax, ecx eax-=ecx
inc eax eax++
dec eax eax--
lea eax, [ecx+4] eax=ecx+4
leave mov esp ebp,pop ebp
retn eip=esp,esp=esp+4
retn N eip=esp,esp=esp+4+N

1. jxx家族

测试标志位的jxx:

指令 描述 条件 别名 相反指令
jc 如果进位位被置位则跳转 进位标志=1 jb,jnae jnc
jnc 如果进位位没有置位则跳转 进位标志=0 jnb,jae jc
jz 如果0标志被置位则跳转 0标志=1 je jnz
jnz 如果0标志没有置位则跳转 0标志=0 jne jz
js 如果符号位被置位则跳转 符号标志=1 jns
jns 如果符号位没有被置位则跳转 符号标志=0 js
jo 如果溢出标志置位则跳转 溢出标志=1 jno
jno 如果溢出标志没有置位则跳转 溢出标志=0 jo
jp 如果奇偶校验位被置位则跳转 奇偶校验标志=1 jpe jnp
jpe 如果奇偶校验位为偶校验则跳转 奇偶校验标志=1 jp jpo
jnp 如果奇偶校验位没有被置位则跳转 奇偶校验标志=0 jpo jp
jpo 如果奇偶校验位为奇校验则跳转 奇偶校验标志=0 jnp jpe

使用无符号数比较的jxx:

指令 描述 条件 别名 相反指令
ja 如果超过(>)则跳转 进位标志=0,0标志=0 jnbe jna
jnbe 如果不低于或等于(不 <=)则跳转 进位标志=0,0标志=0 ja jbe
jae 如果超过或等于(>=)则跳转 进位标志=0 jnc,jnb jnae
jnb 如果不低于则跳转(不 <) 进位标志=0 jnc,jae jb
jb 如果低于(<)则跳转 进位标志=1 jc,jnae jnb
jnae 如果不超过或等于(不>=)则跳转 进位标志=1 jc,jb jae
jbe 如果低于或等于(<=)则跳转 进位标志=1或0标志=1 jna jnbe
jna 如果不超过(不>)则跳转 进位标志=1或0标志=1 jbe ja
je 如果相等(=)则跳转 0标志=1 jz jne
jne 如果不相等(<>)则跳转 0标志=0 jnz je

使用有符号数比较的jxx:

指令 描述 条件 别名 相反指令
jg 如果大于(>)则跳转 符号标志=溢出标志或0标志=0 jnle jng
jnle 如果小于或等于(<=)则跳转 符号标志=溢出标志或0标志=0 jg jle
jge 如果大于或等于(>=)则跳转 符号标志=溢出标志 jnl jge
jnl 如果不小于(不<)则跳转 符号标志=溢出标志 jge jl
jl 如果小于(<)则跳转 符号标志<>溢出标志 jnge jnl
jnge 如果大于或等于(>=)跳转 符号标志<>溢出标志 jl jge
jle 如果小于或等于(<=)跳转 符号标志<>溢出标志或0标志=1 jng jnle
jng 如果不大于(不>)则跳转 符号标志<>溢出标志或0标志=1 jle jg
je 如果等于(=)则跳转 0标志=1 jz jne
jne 如果不等于(<>)则跳转 0标志=0 jnz je

2. 流程控制命令

汇编伪代码 等价伪代码
cmp a,b
jle end

end:
if(a>b)
cmp a,b
jge end

end:
if(a<b)
cmp a,b
jne end

end:
if(a==b)
if(a==1){①}else
switch(a){
case 'c':①;break;
case 'x':②;break;
default:③;
}

注意这里对a--做了
简化处理,实际的汇
编过程中会为a--
请一个临时变量
do{①}while{a--};
while(a--)
for(i=0;i<100;i++)
posted @ 2017-09-16 16:10  T_1  阅读(170)  评论(0编辑  收藏  举报