汇编语言中循环语句的实现

时间:2021-09-01 11:56:27

一、概述

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++;

}