if语句的汇编表示
来源:互联网 发布:mac硬盘清理工具 编辑:程序博客网 时间:2024/06/07 03:15
gcc产生的代码,可以使用objdump查看它对应的汇编代码(gcc查看汇编代码),本文主要介绍条件语句if语句的汇编表示
有以下代码:
int max(int x,int y)
{
if (x>y)
return x;
else
return y;
}
产生的汇编代码如下:
00000000<max>:
0: 55 push %ebp
1: 89 e5 mov %esp,%ebp
3: 8b 45 08 mov 0x8(%ebp),%eax
6: 3b 45 0c cmp 0xc(%ebp),%eax
9: 7e 05 jle 10 <max+0x10>
b: 8b 45 08 mov 0x8(%ebp),%eax
e: eb 03 jmp 13 <max+0x13>
10: 8b 45 0c mov 0xc(%ebp),%eax
13: 5d pop %ebp
14: c3 ret
要理解上面的汇编代码,可以先把C程序写成带有goto语句的版本,
intmax(int x,int y)
{
if (x<=y)
goto x_le_y;
result=x;
goto done;
x_le_y:
result=y;
done:
return result;
}
C代码中if(x>y)在汇编中,先判断x是否小于等于y,如果小于等于,则发生跳转,否则不跳转。
这里,汇编语言也可以使用另外一个规则,
int max(int x,int y)
{
if (x>y)
goto x_ge_y;
result=y;
goto done;
x_ge_y:
result=x;
done:
return result;
}
实际上,汇编语言没有采用上面的做法,因为在C语言中,许多条件语句只有if语句,没有else语句,上面的代码中在这种情况下,也会至少跳转一次,这样会影响程序的效率。
汇编语言中的常见跳转语句:
jmp label直接跳转
je label相等
jne label不等
js label负数
jns label非负数
ja abel大于
jae label大于等于
jb label小于
jbe label小于等于
jg label大于
jge label大于等于
jl label小于
jle label小于等于
jg jge jle jl用于比较有符号数,而ja jae jb jbe用于比较无符号数
有时,编译器为了加快条件语句的转移速度,会使用条件传送指令,改写max函数,如下:
int max(int x,int y)
{
return x>y?x:y;
}
如果使用传统的条件控制语句,会产生类似下面的形式:
if(x<=y)
goto x_le_y;
result=x;
goto done;
x_le_y:
result=y;
done:
return result;
而在gcc中对上面的代码反汇编,产生的汇编的代码如下:
00000000<max>:
0: 55 push %ebp
1: 89 e5 mov %esp,%ebp
3: 8b 45 08 mov 0x8(%ebp),%eax
6: 39 45 0c cmp %eax,0xc(%ebp)
9: 0f 4d 45 0c cmovge 0xc(%ebp),%eax
d: 5d pop %ebp
e: c3 ret
x存放在0x8处,y存放在0xc处,汇编语句中先将返回值设为x,如果y>=x,再将返回值修改为y.
这种方式是先预测分支,执行这个分支,如果预测错误,再跳转到其他分支,如果预测正确指令执行的时间为Tr,预测错误时,错误处罚是Tp,预测分支正确的概率为p,则这个条件语句执行的平均时间为p*Tr+(1-p)*(Tr+Tp).
常见的条件传送语句有:
cmove零 cmovne非零 cmovs负数 cmovns非负cmovg大于 cmovge大于或者等于comvl小于 omvle小于或者等于 对于无符号数,有对应的cmova comvae comvb comvbe四条指令
条件并不能在所有条件下替代条件控制语句,比如
int f(int *x)
{
return x?*x:0;
}
这段代码中,如果x为空指针,条件传送会先将*x取出,这时会发生错误,所以,条件传送只是条件控制语句在某些情况下的替代,它不能完全取代条件控制语句。
- if语句的汇编表示
- 循环语句的汇编表示
- if 语句在汇编的作用
- IF语句的反汇编判断
- IF...ELSE...语句的反汇编判断
- IF...ELSE IF...ELSE IF...ELSE多分枝语句的反汇编判断
- if,while和do..while语句的汇编形式代码
- 反汇编之流程控制语句的识别(if语句)
- 反汇编之流程控制语句的识别(if...else...语句)
- 一起来学反汇编-之if语句
- C++反汇编一(if语句)
- C++反汇编二(if...else语句)
- C++反汇编->if语句分析
- 汇编学习第三课之if/if...else语句分析
- 快速识别汇编中等价的C语言语句(if, while, for, switch)
- 快速识别汇编中等价的C语言语句(if, while, for, switch)
- 快速识别汇编中等价的C语言语句(if, while, for, switch)
- 递归函数的汇编表示
- 网格算法-STG游戏弹幕检测思路
- 经典排序算法 - 希尔排序Shell sort
- Git 2.0 changes push default to 'simple'
- 写给阿晨的第四封信
- STM32学习笔记之:stm32通用定时器
- if语句的汇编表示
- eclipse强大的代码提示插件——aptana
- UML之类图
- 5样家居用品别舍不得扔
- 15分钟学会使用Git和远程代码库
- linux 之shell编程
- boost::regex处理中文方法
- 短信分享
- C陷阱与指针--读书笔记