关于分支结构与循环结构的思考

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


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值