一、概述
C语言中有许多不同的结构,比如if-else、do-while、while、for、swich等等,这些结构的汇编实现都是一层一层在前者的基础上进行构建的。比如if-else是基于jmp命令实现的,do-while是基于if-else的汇编结构的,而while又是基于do-while的。所以说jmp在汇编中有着特别重要的作用,它是实现多种C语言结构的基础。
if-else依赖于跳转指令;
do-while循环先被转换为if-else,然后再进行翻译,其中使用较多的是比较命令cmp和条件跳转指令;
while循环先被转化为 if 和 do-while的结合体,然后再分别进行翻译;
for循环与while循环非常类似,仅是多了一个赋值语句而已,翻译过程与while类似,但要注意continue的处理,谨防处理不当而使得语句陷入死循环。
二、jmp命令
三、if-else的汇编语言形式
.
四、do-while的汇编形式
大多数汇编器根据一个循环的do-while形式来产生循环代码,其他的循环会首先转换成do-while形式,然后再进行编译,所以do-while循环是所有循环结构的基础。它的汇编翻译如下形式
五、while循环
将while循环翻译成机器代码有很多种方法,一种常见的方法,也是GCC采用的方法,是使用条件分支,在需要时省略循环体的每一次执行,从而将代码转换成do-while循环,具体实例如下:
六、 for循环
首先可以将for循环转换为while循环,然后再按照上面的方法,最终完成for循环到机器代码的转换。但在这里需要特别注意的是,当循环中出现有continue时,一定要注意控制变量的自增或自减操作,否则会导致无限循环。
比如将如下C语句代码翻译成机器语言:
int sum = 0;
int i;
for(i = ; i < 10; i++){
if (i & 1)
continue;
sum += i;
}
如果按照如下的方式进行转换的话,continue语句会阻止索引变量i被修改,导致代码无限循环:
int sum = 0;
int i = 0;
while (i < 10)}
if (i & 1)
continue;
sum += i;
i++;
}
所以,正确的翻译方法为:
int sum = 0;
int i = 0;
while (i < 10)}
if (i & 1)
goto update;
sum += i;
update:
i++;
}