(本文更新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++){①} |