`

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语言编译成masm32汇编语言

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

    gcc中的内嵌汇编语言

    在Linux的核心代码中,还是存在相当一部分的汇编语言代码。如果你想顺利阅读Linux代码的话,你...另一部分则是利用gcc的内嵌式汇编语言语句asm嵌在Linux的C语言代码中的。这篇文章主要是介绍第二种形式的汇编语言代码。

    编译原理---简易C编译器 生成汇编语言代码

    快要过去的一个学期里,学了编译原理...能实现加减乘除四则运算,取模赋值运算,逻辑表达式运算,复合语句,if,while,for语句~支持输入输出,最终生成汇编语言代码。移位运算没写。 调试过了,如有好建议请大家赐教。

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

    单片机的C语言中如何嵌套汇编语言,对学习单片机编程的学习者有很大帮助

    8位和1位跑马灯C语言、汇编代码_8位和1位跑马灯C语言、汇编代码_

    8位和1位跑马灯C语言、汇编代码,主要利用了基本的循环语句和移位操作符实现8位和1位跑马灯的实现,看到的运行即结果是灯亮一会,熄灭,下一盏灯亮一会又熄灭,下下一盏灯接着亮,如此循环跑动的动态显示效果

    汇编实验参考代码

    2、C语言编写多重循环程序,查看其反汇编码,分析各条语句功能,并采用汇编语言编写相同功能程序。 反汇编在WinDbg 考虑两重循环 3、结合Windows界面编程,实现计算器功能。 可以调用Windows的计算器 4、实现内存...

    编译原理课程设计-C语言子集编译器(含报告和可运行源代码).rar

    通过所设计的C语言子集编译器能够对用户所输入的C语言子集程序代码进行词法分析、语法分析和语义分析,能将源代码编译成汇编指令(伪指令)。在进行编译的过程中,能过滤去 “//”或“/* */”形式的文字注释,具备...

    简单C语言编译程序_只实现到中间代码

    该程序是本人08年大三的时候写的,可以把一个编写有简单C语言代码(只有数值变量,表达式带有{}的if和While语句,if和while可以嵌套)的文件读入,并把代码翻译成中间代码

    哈工大汇编实验代码

    哈工大汇编实验代码 循环队列的设计(先进先出) 本循环队列用数组 BYTE 16 dup(?)实现 入队指针ip,出队指针op,可用变量或寄存器指示。任一指针到数组尾部后再加1,则指针回数组头部。初始ip=op=0,空队列。 入队...

    C语言代码优化 方案

    (8)将大的switch语句转为嵌套switch语句 (9)循环转置 (10)公用代码块 (11)提升循环的性能 (12)选择好的无限循环 6、提高CPU的并行性 (1)使用并行代码 (2)避免没有必要的读写依赖 7、循环不变计算 8、...

    汇编语言与C语言的混合程序设计技术_王文东

    以调用汇编语言子程序, 汇编语言主程序可以调用C 语言子程序, 也可以在C 语言程序中嵌入汇编语言语句。在汇编语言 与C 语言的混合编程中, 参数的传递、模块的连接以及调用关系的确定是值得注意的关键问题。

    将WHILE语句翻译成四元式-Compiler

    设计一个语法制导翻译器,将WHILE语句翻译成四元式。 要求:先确定一个定义WHILE语句的文法,为其设计一个语法分析程序,为每条产生式配备一个语义子程序,按照一遍扫描的语法制导翻译方法,实现翻译程序。 对用户...

    ARM汇编实现log2函数

    用ARM汇编子程序实现求以2为底的对数。...其中C语言程序是入口控制程序,调用ARM的汇编语言程序,以半主机方式(模拟器方式)完成输入和输出,以及代码的调试。要求对C代码和ARM汇编代码地语句加以注释。

    c语言入门教材.txt

    C 语言是以函数形式提供给用户的,这些函数可方便的调用,并具有多种循环、条件语句控制程序流向,从而使程序完全结构化。 3. C语言功能齐全 C语言具有各种各样的数据类型,并引入了指针概念,可使程序效率更高。另外...

    C语言高级实例解析

    C语言把高级语言的基本结构和语句与低级语言的实用性结合起来。C语言可以像汇编语言一样对位、字节和地址进行操作,而这三者是计算机最基本的工作单元。在系统开发,特别是操作系统、底层开发中,C语言的效率是其他...

    编译原理课程设计——算术表达式、for、while语句转换为四元式.pdf

    编译原理课程设计——算术表达式、for、while语句转换为四元式.pdf

    C语言入门经典(第4版)--源代码及课后练习答案

    他曾在IBM工作多年,能使用多种语言进行编程(在多种机器上使用汇编语言和高级语言),设计和实现了实时闭环工业控制系统。Horton拥有丰富的教学经验(教学内容包括C、C++、Fortran、PL/1、APL等),同时还是机械、加工...

    C语言高级实例解析光盘

    C语言把高级语言的基本结构和语句与低级语言的实用性结合起来。C语言可以像汇编语言一样对位、字节和地址进行操作,而这三者是计算机最基本的工作单元。在系统开发,特别是操作系统、底层开发中,C语言的效率是其他...

Global site tag (gtag.js) - Google Analytics