C语言中有分支结构和循环结构,他们是用机器指令完成的。那么他们是怎么实现的呢?
机器指令中有cmp指令,比较两个数的大小,接着用jxx指令跳转。
C语言中有分支结构和循环结构,他们是用机器指令完成的。那么他们是怎么实现的呢?
机器指令中有cmp指令,比较两个数的大小,接着用jxx指令跳转。
je 相等则跳转
jne 不相等则跳转
jg 有符号数大于则跳转
jge 有符号数大于等于则跳转
jl 有符号数小于则跳转
jle 有符号数小于等于则跳转
ja 无符号数大于则跳转
jae 无符号数大于等于则跳转
jb 无符号数小于则跳转
jbe 无符号数小于等于则跳转
jmp 无条件跳转
cmp 和 jXX的组合可以看成if(xxx)goto 语句的组合。
cmp 和 jXX的组合可以看成if(xxx)goto 语句的组合。
void fun(void)
{
i=0;
while(i<10)
{
printf("%d\n",i);
i++;
}
}
改为goto模式
void fun(void)
{
i=0;
goto l1;
l2:
printf("%d\n",i);
i++;
l1:
if(i<10)
goto l2;
}
改为汇编模式
.section .rodata
.LC0:.string "%d\n"
.section .text
fun:
pushl %ebp
movl %esp,%ebp
pushl %ebx
movl $0,%ebx
jmp .L1
.L2:
pushl %ebx
pushl $.LC0
call printf
addl $8,%esp
addl $1,%ebx
.L1:
cmpl $10,%ebx
jl .L2
popl %ebx
movl %ebp,%esp
popl %ebp
ret
其他语句的组合方式
if语句
void fun(int a)
{
if(a>100)
{
printf("big\n");
}
}
///
void fun(int a)
{
if(a<=100)
goto l1;
printf("big\n");
l1:
}
if-else语句
void fun(int a)
{
if((a&1)==0)
{
printf("low\n");
}else
{
printf("hight\n");
}
}
///
void fun(int a)
{
if((a&1)!=0)
goto l1;
printf("low\n");
goto l2;
l1:
printf("hight\n");
l2:
}
for语句
void fun(int len)
{
int i;
for(i=0;i<len;i++)
{
printf("%d\n",i);
}
}
///
void fun(int len)
{
int i;
i=0;
goto l1;
l2:
printf("%d\n",i);
i++;
l1:
if(i<len)
goto l2;
}