`

c语言控制语句对应的汇编语句代码

阅读更多

 

转:http://blog.csdn.net/mindview/archive/2008/03/17/2192878.aspx

 

 

1、if-then
if-then语句的通用形式为:
    if (test-expr)
        then-statement
    else
        else-statement
    这里的test-expr是整型表达式,它的取值为0或者为非0。
if-then语句对应的汇编实现形式为:
    t = test-expr;
    if (t)
        goto true;
        else-statement
        goto done;
    ture:
        then-statement
    done:
       
下面通过一个例子说明:
/* $begin absdiff-c */
int absdiff(int x, int y)
{
    if (x < y)
    return y - x;
    else
    return x - y;
}
/* $end absdiff-c */
查看gcc生成的汇编代码可以看到如下代码:
        movl    8(%ebp), %edx        ;x->edx
        movl    12(%ebp), %eax    ;y->eax
        cmpl    %eax, %edx            ;x-y
        jge     .L2                    ;if(x>=y) then goto .L2
        popl    %ebp                    ;reset frame pointer
        subl    %edx, %eax            ;then-statement(take care!)
        ret                                ;return (always put the return value in eax)
        .p2align 4,,7                ;why? I don't know!
.L2:                                        ;else-part
        popl    %ebp                    ;reset frame pointer
        subl    %eax, %edx            ;else-statement
        movl    %edx, %eax           
        ret                                ;return
2、do-while
do-while语句的通用形式为:
    do
        body-statement
        while(test-expr);
注意:body-statement至少执行一次。
该语句对应的汇编实现形式为:
    loop:
        body-statement
        t = test-expr;
        if(t)
            goto loop;
下面通过一个例子加深理解:
/* $begin fibdw-c */
int fib_dw(int n)
{
    int i = 0;
    int val = 0;
    int nval = 1;

    do {
    int t = val + nval;
    val = nval;
    nval = t;
    i++;
    } while (i < n);

    return val;
}
/* $end fibdw-c */
查看其对应的汇编代码如下:
        subl    $16, %esp            ;for local variables:t->nval->val->i
        movl    $0, -16(%ebp)        ;i = 0
        movl    $0, -12(%ebp)        ;val = 0
        movl    $1, -8(%ebp)        ;nval = 1
.L2:
        movl    -8(%ebp), %eax    ;nval->eax
        addl    -12(%ebp), %eax    ;val+nval->eax
        movl    %eax, -4(%ebp)    ;eax->t
        movl    -8(%ebp), %eax    ;nval->eax
        movl    %eax, -12(%ebp)    ;eax->val
        movl    -4(%ebp), %eax    ;t->eax
        movl    %eax, -8(%ebp)    ;eax->nval
        addl    $1, -16(%ebp)        ;i++
        movl    -16(%ebp), %eax    ;i->eax
        cmpl    8(%ebp), %eax        ;i-n
        jl      .L2                    ;if (i<n) then goto .L2
        movl    -12(%ebp), %eax    ;return val
3、while语句
while语句的通用形式为:
    while(test-expr)
        body-statement
直接翻译成使用goto语句的形式为:
    loop:
        t = test-expr;
        if(!t)
            goto done;
        body-statement
        goto loop
    done:
由于这样的翻译要求内循环,大多说c编译器将这段代码转换成do-while循环。
    t = test-expr   
    if(!t)
        goto done;
    loop:
        body-statement
        t = test-expr;
        if(t)
        goto loop;
    done:
或者:
        goto L
    loop:
        body-statement
    L:
        t = test-expr
        if(t)
            goto loop

举个例子:
/* $begin fibw-c */
int fib_w(int n)
{
    int i = 1;
    int val = 1;
    int nval = 1;

    while (i < n) {
    int t = val+nval;
    val = nval;
    nval = t;
    i++;
    }

    return val;
}
/* $end fibw-c */
对应的汇编代码如下:
        subl    $16, %esp            ;for local variables:t->nval->val->i
        movl    $1, -16(%ebp)        ;i = 1
        movl    $1, -12(%ebp)        ;val = 1
        movl    $1, -8(%ebp)        ;nval = 1
        jmp     .L6                   
.L7:                                        ;body-statement
        movl    -8(%ebp), %eax    ;nval->eax   
        addl    -12(%ebp), %eax    ;nval+val->eax
        movl    %eax, -4(%ebp)    ;eax->t
        movl    -8(%ebp), %eax    ;nal->eax
        movl    %eax, -12(%ebp)    ;eax->val
        movl    -4(%ebp), %eax    ;t->eax
        movl    %eax, -8(%ebp)    ;eax->nval
        addl    $1, -16(%ebp)        ;i++
.L6:
        movl    -16(%ebp), %eax    ;i->eax
        cmpl    8(%ebp), %eax        ;i-n
        jl      .L7                    ;if(i<n) goto .L7
        movl    -12(%ebp), %eax    ;return value
4、for语句
for语句的通用形式为:
    for(init-expr;test-expr;update-expr)
        body-statement
for语句的语义可以用while语句表示:
    init-expr;
    while (test-expr) {
        body-statement
        update-expr;
    }
这样就可以根据前面的while语句的翻译来实现for语句的翻译:
init-expr;
goto L;
loop:
    body-statement
    update-expr;
L:
    t = test-expr;
    if(t)
        goto loop
for example:
/* $begin fibf-c */
int fib_f(int n)
{
    int i;
    int val = 1;
    int nval = 1;

    for (i = 1; i < n; i++) {
    int t = val+nval;
    val = nval;
    nval = t;
    }

    return val;
}
/* $end fibf-c */
对应汇编代码:
          subl    $16, %esp            ;for local variables
        movl    $1, -12(%ebp)        ;val=1
        movl    $1, -8(%ebp)        ;nval=1
        movl    $1, -16(%ebp)        ;init-expr
        jmp     .L16                    ;goto L
.L17:
        movl    -8(%ebp), %eax    ;body-statement starts
        addl    -12(%ebp), %eax
        movl    %eax, -4(%ebp)
        movl    -8(%ebp), %eax
        movl    %eax, -12(%ebp)
        movl    -4(%ebp), %eax
        movl    %eax, -8(%ebp)    ;body-statement ends
        addl    $1, -16(%ebp)        ;update-expr
.L16:
        movl    -16(%ebp), %eax    ;if(i<n) goto .L17
        cmpl    8(%ebp), %eax
        jl      .L17
        movl    -12(%ebp), %eax    ;reture val
5、switch语句
switch语句提供了根据一个整型索引值进行多重分支的能力。它不但提供了c代码的可读性,而且使用一种称为跳转表的数据结构使得实现更加高效。下面通过例子说明:
/* $begin switch-c */
int switch_eg(int x)
{
    int result = x;

    switch (x) {

    case 100:
    result *= 13;
    break;

    case 102:
    result += 10;
    /* Fall through */

    case 103:
    result += 11;
    break;

    case 104:
    case 106:
    result *= result;
    break;

    default:
    result = 0;      
    }

    return result;
}
/* $end switch-c */
这个程序不用说,谁都看的懂,下面主要看它所对应的汇编代码:
        movl    8(%ebp), %eax                ;x->eax
        leal    -100(%eax), %edx            ;x-100->edx
        cmpl    $6, %edx                    ;if(x-100>6) goto .L2(default case)
        ja      .L2
        jmp     *.L7(,%edx,4)                ;redirect jump to .L7+4*edx(goto .L7[edx])
        .section        .rodata
        .align 4
        .align 4
.L7:
        .long   .L3                            ;case 100
        .long   .L2                            ;default case
        .long   .L4                            ;case 102
        .long   .L5                            ;case 103
        .long   .L6                            ;case 104
        .long   .L2                            ;default case
        .long   .L6                            ;case 106
        .text
        .p2align 4,,7
.L2:                                                ;default case
        popl    %ebp                            ;result = 0;
        xorl    %eax, %eax
        ret
.L3:                                                ;case 100
        popl    %ebp                            ;result *= 1300 => result = 1300
        movl    $1300, %eax               
        .p2align 4,,6
        ret
.L6:                                                ;case 104,106
        imull   %eax, %eax                    ;result = result^2
        popl    %ebp
        .p2align 4,,4
        ret
.L5:                                                ;case 103
        popl    %ebp                            ;result += 11
        movl    $114, %eax   
        .p2align 4,,4
        ret
.L4:                                                ;case 102
        popl    %ebp                            ;result += 10   
        movl    $123, %eax                    ;result += 11
        .p2align 4,,4
        ret
其中.L7执行的内存空间内存放的就是跳转表,它是一个数组,表项i(.L2--.L6)是一个代码段的地址,这个代码实现的是当开关索引值等于i时程序应该采取的动作。程序代码用开关索引值来执行一个跳转表内的数组引用,确定跳转指令的目标。和使用很长的if-else语句相比,使用跳转表的优点是执行开关语句的时间与开关情况的数量无关。GCC根据开关情况的数量和开关情况值的稀疏程度来翻译开关语句。当开关情况数量比较多,并且值的范围跨度比较小时,就会使用跳转表。

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/mindview/archive/2008/03/17/2192878.aspx

分享到:
评论

相关推荐

    C语言基础教程3输入输出函数及控制流程语句[汇编].pdf

    C语言基础教程3输入输出函数及控制流程语句[汇编].pdf

    可以将C语言转变为汇编的编译器

    标题中的“可以将C语言转变为汇编的编译器”是指一种特殊的编译器,它的主要功能是将C语言编写的源代码转换成汇编语言。这种编译器是编程领域中的一个重要工具,它帮助程序员深入理解底层计算机工作原理,尤其是在...

    全国计算机二级C语言笔试历届真题汇编

    这份文件是一份关于全国计算机二级C语言考试的笔试试题汇编,涵盖了2006年至2010年的试题。根据所给内容,我们可以提炼出以下知识点: 一、C语言基础 1. C语言中的线性表有链式存储结构和顺序存储结构,它们在存储...

    c编译器,将C语言编译成masm32汇编语言

    也不支持switch语句,个人感觉swich没用,#include不支持,只支持“ ”,现在打包给大家分享,包括源代码(感兴趣的可以自己修改或者转发学习,不允许商业用途),里面还有一些例子,想学习编译原理或者masm32的同志...

    汇编与C语言工具合集

    汇编语言是一种低级编程语言,它直接对应于计算机硬件的指令集,每个语句几乎都直接映射到一个或多个机器代码。MASM60是Microsoft的汇编器,它支持80x86架构的Intel汇编语言,为编写和编译汇编程序提供了强大的平台...

    单片机C语言和汇编语言混合编程实例详解-杜树春.rar

    1. C语言与汇编语言的基础:首先,读者需要了解两种语言的基本概念和语法,包括C语言的关键字、数据类型、流程控制语句以及汇编语言的指令集、寄存器使用等。 2. 混合编程环境设置:介绍如何配置开发环境,如选择...

    单片机的c语言嵌套汇编语言

    在单片机编程中,有时候为了实现特定的功能或者优化性能,我们需要在C语言程序中嵌入汇编语言代码。这通常涉及到对硬件直接操作、中断处理或者特定算法的实现。对于MCS-51系列单片机,这种混合编程模式是常见的实践...

    汇编:C语言.zip

    - 通过比较C语言的源代码和对应的汇编代码,可以理解编译器如何将高级语言转化为机器可理解的语言。 - 学习C语言中的指针时,汇编视角有助于理解内存地址和数据访问的实际操作。 - 函数调用的过程,包括参数传递...

    从C语言到汇编,从汇编到C语言

    4. 通过对C语言代码的反汇编结果分析,我们可以学习如何追踪高级语言中的语句转换为底层的汇编指令。这有助于我们理解程序在机器层面上是如何工作的,也有助于在进行性能优化或调试程序时,能够更好地定位和解决问题...

    AVR MCU在C语言中嵌入汇编的一个实例

    - 在中断服务程序中,使用`asm volatile`语句嵌入汇编代码,直接控制硬件寄存器。 - 汇编代码通过`ldr`指令加载`Key`数组中的值到寄存器,并使用`out`指令将值写入PORTA口的输出寄存器。 4. **延时机制**: - ...

    ARM汇编语言与嵌入式C语言混合编程

    因此,了解如何在C语言中嵌入汇编代码或如何在C语言和汇编语言之间进行相互调用是十分必要的。 #### 内嵌汇编 内嵌汇编是指在C语言程序中嵌入汇编代码的一种方式。这种方式可以用来执行那些C语言难以处理的任务,...

    C语言内嵌arm汇编

    这使得开发者可以在C程序中直接插入汇编语句,执行特定的硬件操作,如内存访问、计算或中断处理。 2. **ARM汇编基础** - ARM架构:ARM(Advanced RISC Machines)处理器使用RISC(Reduced Instruction Set ...

    浅谈单片机中C语言与汇编语言的转换.docx

    C语言以其结构化、易读性强、可移植性好等优点被广泛应用,而汇编语言则能更直接地控制硬件,对于性能敏感的代码优化有显著优势。本文以51单片机的99码表设计为例,探讨如何在C语言和汇编语言之间进行转换。 首先,...

    实验一_汇编霹雳灯_霹雳灯_霹雳灯c代码_霹雳灯C语言_

    C代码编译后会产生汇编代码,通过反汇编器我们可以查看这些代码对应的汇编指令。理解这些指令如何映射到C代码的语句上,有助于深入理解程序的执行流程。 在汇编代码中,我们将看到如MOV(移动数据)、JMP(跳转)、...

    单片机C语言与汇编混编经典实例

    在"单片机C语言与汇编混编经典实例"中,你可能会学到如何定义汇编子程序并在C代码中调用,如何在C语言中使用汇编语句块(__asm__),以及如何在C代码中访问和修改硬件寄存器。这些实例将涵盖各种实际应用,包括...

    8051单片机c语言控制与应用

    1. 代码优化:合理使用循环和条件语句,避免冗余的内存访问,可以提高程序运行效率。 2. 内存管理:了解8051的内存结构,合理分配和使用内部RAM和ROM,可以减少程序出错的可能性。 3. 波特率计算:在进行串行通信...

    二级C语言填空题分类汇编.doc

    本资源摘要信息是关于C语言的填空题分类汇编,涵盖了C语言的基本概念、变量、数据类型、运算符、控制结构、函数、数组、指针等方面的知识点。 1. 变量和数据类型 变量是存储数据的命名存储单元。C语言中有多种数据...

    汇编与C语言的对比.rar

    汇编语言是计算机硬件与高级语言之间的桥梁,它直接对应于机器指令,每条语句都对应一个特定的机器码。这种语言的编写直接控制了计算机硬件,因此执行效率极高,尤其在处理底层硬件操作、系统级编程和性能敏感的代码...

    C语言初学者习题汇编及参考答案.docx

    C语言初学者习题汇编及参考答案 本资源为C语言初学者提供了一系列习题和参考答案,涵盖了C语言的基础知识点,包括变量、数据类型、运算符、控制结构、函数等。习题涵盖了基本的输入输出、数据类型转换、逻辑判断、...

Global site tag (gtag.js) - Google Analytics