汇编语言跳转翻译为c语言if else语句

来源:互联网 发布:卖家怎么防止淘宝客 编辑:程序博客网 时间:2024/06/05 16:04

将条件表达式和语句从c语言翻译成机器代码,最常用的方式是结合有条件和无条件跳转(这里只讨论有条件跳转)


对于大多数情况 汇编代码就是c语言的直接翻译

而c语言中的goto语句类似于汇编中的无条件跳转所以先看一下 if else 由goto语句完成

int absdiff(int x, int y)//返回两数差的绝对值{if(x<y)//测试x是否大于等于y如果是则跳转elsereturn y-x;elsereturn x-y;//如果x大于等于y则x-y}
goto函数的功能与上面的函数功能完全相同 (返回两数差的绝对值)
int gotodiff(int x, int y){int result;if(x>= y)//测试x是否大于等于y如果是则跳转goto x_ge_y;result = y-x;goto done;x_ge_y://如果x大于等于y则x-yresult = x - y;done:return result;}


可以看到if else语句转为goto语句的直接翻译方式 


t = test - expr;

if(!t)//c语言中真为非零  假为零

goto false;

then - statement

goto done;

false;

else - statement

done:



汇编中跳转转化为c语句此处使用ATT代码格式(取自深入理解计算机系统)

x位于%ebp+8    y位于%ebp+12

movl 8(%ebp), %eaxmovl 12(%ebp), %edx
cmpl $-3, %eax//x - (-3)操作同sub指令相同但是无目的操作数jge .L2//如果x 大于等于-3则跳转至标记 L2cmpl %edx, %eax//比较x yjle .L3//如果x小于等于y则跳转至L3imull %edx, %eax//如果x大于y则执行此处并跳转至L4jmp .L4//直接跳转不需要条件.L3:leal (%eax, %edx), %eax//此处x小于等于y则 x+y将结果保存到val中
jmp .L4
.L2://x大于等于-3cmpl $2, %eaxjg .L5//如果x大于2执行此处xorl %edx, %eax//当前面所有条件都不满足时执行 也就是最开始的赋值jmp .L4.L5://由前面执行时是个跳转 到达标记L5subl %edx, %eax.L4:


c代码

int test(int x, int y){int val = x^y;//所有条件不满足 if(x<-3)//如果x>=-3则不满足条件发生跳转{if(y<x)//如果y>=x则达到elseval = x*y;elseval = x + y;}else if(x > 2)//x>2满足条件则执行此处跳转val = x -y;return val;//返回val值}











原创粉丝点击