文章目录
首先,每天的C汇编搁了两天,要继续了,加油。
今天讲的是C语言在的while循环语句。
一、while语句
while(i <= 5)
{
sum = sum + i;
i++;
}
1、代码示例
while利用 i 作为循环条件,不断地进行 sum 求和。
#include "stdafx.h"
int main(int argc, char* argv[])
{
printf("Hello World!\n");
int i = 1,sum = 0;
while(i <= 5)
{
sum = sum + i;
i++;
}
printf("sum=%d\n",sum);
return 0;
}
2、反汇编
如上图,可以发现 while (){循环体} 语句的原理是:首先用 cmp 与
被比较数 5进行 cmp比较,如果相反,则跳转地址(即 jg main+4Dh)。当执行完循环体时,利用 jmp + 条件地址 实现跳转,跳转到 while()语句 执行下一次循环。
3、汇编代码实现:
方法一:按照反汇编模式进行汇编
_asm
{
mov eax, [ebp - 4]
mov ebx, [ebp - 8]
begin:
cmp eax, 5
jg end
add ebx, eax
inc eax
jmp begin
end: mov [ebp - 4], eax
mov [ebp - 8], ebx
}
方法二:
_asm
{
mov eax, [ebp - 4]
mov ebx, [ebp - 8]
mov ecx, 5
s: add ebx, eax
inc eax
loop s
mov [ebp - 4], eax
mov [ebp - 8], ebx
}
二、do……while语句
1、代码示例:
#include "stdafx.h"
int main(int argc, char* argv[])
{
printf("Hello World!\n");
int i = 1,sum = 0;
do{
sum = sum + i;
i++;
}while(i <= 5);
printf("sum=%d\n",sum);
return 0;
}
2、反汇编
如上图可知,do {循环体} while() 循环语句与while类似,只是首先执行了一遍循环体,当执行到while语句时,先用 cmp 和 被比较数5进行比较,如果满足条件(这里是jle),则返回循环体。
3、汇编实现
方法一;
_asm
{
mov eax, [ebp - 4]
mov ebx, [ebp - 8]
mov ecx, 5
s: add ebx, eax
inc eax
loop s
mov [ebp - 4], eax
mov [ebp - 8], ebx
}
三、for循环语句
1、代码示例
#include "stdafx.h"
int main(int argc, char* argv[])
{
printf("Hello World!\n");
int i = 1,sum = 0;
for(; i<=5; i++)
{
sum = sum + i;
}
printf("sum=%d\n",sum);
return 0;
}
2、反汇编
由图可知,for(i=0; i<=5; i++)循环语句,i=1 可以分解为:mov指令使 i = 1,然后 jmp 执行条件语句(即cmp比较语句)。i <= 5类似于while中的条件比较,首先 cmp 进行比较,如果不满足条件(即jg 大于),则跳出循环体。当执行完循环体后,jmp 跳转到 i++ 语句,i++ 执行完成之后,执行 cmp 语句,然后执行循环体。