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

汇编与C的基本逻辑语句对应关系 基本函数结构:push        ebpmov         ebp,espsub          esp,44hpush        ebxpush        esipush        edilea           edi,[ebp-44h]mov         ecx,11hmov         eax,0CCCCCCCCh 阅读详情
 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根据开关情况的数量和开关情况值的稀疏程度来翻译开关语句。当开关情况数量比较多,并且值的范围跨度比较小时,就会使用跳转表。
C语言进行函数调用时的汇编代码浅析 一、什么是汇编语言 汇编语言, 即第二代计算机语言,用一些容易理解和记忆的字母,单词来代替一个特定的指令。是一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。在汇编语言中,用助记符代替机器指令的操作码,用地址符号或标号代替指令或操作数的地址。在不同的设备中,汇编语言对应着不同的机器语言指令集,通过汇编过程转换成机器指令。(摘自百度百科) ... 阅读详情

相关推荐

KeilC查看c51对应的汇编指令并分析c51语句的执行时间

1.开启调试 调试->启动/停止调试 2.打开反汇编窗口 可以点 :调试->在线汇编 或点快捷键 得到如下c51语句对应的汇编指令 c51语句下面的就是对应的汇编指令 1.main函数对应的指令,由指令知道跳转到delay() 2… C:0x000F E4 CLR A//将寄存器A中数据置0 C:0x0010 FF MOV R7,A//将A中的数据给寄存器R7 这里没有执行for循环括号中的内容 3.执行for循环括号中的内容,从

xcj1409385086的博客 6237

汇编指令学习(CMP,TEST)

比较两个操作数,如果两个数相等,zf标志位就为1,将eax,ebx的值置为1,执行下面指令,je这个跳转指令就会根据zf标志位进行跳转

Web安全工具库 1458

开源数显表

开源数显表,广泛应用于车床、铣床、磨床、镗床、火花机、线切割等。市面上此类液晶数显表多数都是基于此项目。 一、基本配置 硬件 主控:STM32F407VGT6 LCD:群创AT070TN92 显示驱动:RA8875 光栅尺:3 x 输入(X/Y/Z) 串口:1 x MAX3232 继电器:2 x 输出 存储:AT24C64 模拟输入:LM324C 电源:AC 220V 软件 工程版本:Keil 5 STM32库:V1.4.0 图形界面:uCGUI 多语言支持:中文、英文 二、项目文

m0_70934529的博客 435

解析C语言及对应的汇编指令--复杂数据类型

1. 数组 C代码: #include <stdio.h> #include <stdlib.h> int main() { //数组的初始化 int a[10] = {1,2,3,4,5}; //数组的访问 int b = a[2]; //数组的循环 for(int i=0;i<10;i++){ printf("%d\n",a[i]); } //数组的修改 a[0]=100; retu

小尘_OnMyWay的博客 1171

保姆级教程:在RK3588开发板上配置USB-C PD充电(基于HUSB311芯片与DTS详解)

本文详细介绍了在RK3588开发板上配置USB-C PD充电的完整流程,重点解析了HUSB311芯片的硬件原理与DTS安全配置。通过实战案例和调试技巧,帮助开发者避免常见错误,实现稳定可靠的Type-C PD快充功能,适用于从基础开发板到工业设备的多场景需求。

weixin_42552315的博客 522

从SAR信号到洪涝地图:基于Sentinel-1数据的水体快速提取实战

本文详细介绍了如何利用Sentinel-1 SAR数据快速提取水体信息并生成洪涝地图的实战方法。通过预处理五部曲和SDWI指数计算,结合具体案例展示了SAR技术在洪涝灾害应急监测中的高效性和准确性,为救援决策提供关键支持。

weixin_29201313的博客 464

解析C语言及对应的汇编指令--流程控制语句

文章目录1. 分支控制 if else2. for循环3. while循环4. do...while循环5. switch语句1. 非跳转表2. 跳转表 本文主要解析C语言中的流程控制语句if else、for、while、do while、switch语句的汇编指令。 操作系统:Ubuntu64位 IDE: Codeblocks 汇编格式:AT&T 1. 分支控制 if else #include <stdio.h> #include <stdlib.h> int mai

小尘_OnMyWay的博客 2180

Verilog简易电梯控制系统(2层)

电梯处于1楼,按KEY3,LED3亮,电梯处于上行状态时,立刻按 KEY2,LED2亮,电梯继续运行至2楼,LED3灭;按KEY3,LED3亮,电梯处于上行状态时,立刻按 KEY0,LED0亮,电梯继续运行至2楼,LED3灭;电梯处于2楼,按KEY2,LED2亮,电梯处于下行状态时,立刻按 KEY3,LED3亮,电梯继续运行至1楼,LED2灭;电梯处于2楼,按KEY2,LED2亮,电梯处于下行状态时,立刻按 KEY1,LED1亮,电梯继续运行至1楼,LED2灭;电梯运行至2楼后LED1灭,2楼待机。

m0_54240221的博客 6957

解析C语言及对应的汇编指令--栈与函数调用

1. 栈结构 在内存栈区中,%rbp指向当前栈底,%rsp指向当前栈顶;当发生函数调用时,会将下条指令返回地址压栈,并设置为新的栈底%rbp;然后给局部变量预留空间(栈顶指针%rsp上移)。 2. 反汇编解析 C代码: #include <stdio.h> #include <stdlib.h> int sum(int a,int b){ int sum = a + b; return sum; } int main() { int a = 1;

小尘_OnMyWay的博客 1057

RT-Thread新手必看:FMT飞控移植中的5个常见坑及解决方案

本文针对RT-Thread新手在移植FMT开源飞控时遇到的5大核心挑战,提供了深度解决方案。内容涵盖SCons构建系统配置、RT-Thread版本API兼容性处理、BSP与设备驱动适配、TOML系统配置解析以及算法模块集成调试,帮助开发者高效避坑,成功完成飞控移植。

gin88的博客 250

【nerfStudio】1-在windows上安装nerfStudio

安装Git。安装Visual Studio 2022。在安装CUDA之前必须完成此步骤。必须在“桌面开发与C++”工作流程(在BuildTools版本中称为“C++构建工具”)中包含所需的组件。Nerfstudio要求。我们建议使用conda来管理依赖关系。在继续之前,请确保安装了Conda。 依赖关系 PyTorch 请注意,如果安装了低于2.0.1的PyTorch版本,则应卸载先前版本的pytorch、functorch和tiny-cuda-nn。 基于CUDA 11.8的Torch 2.0.1 安装基

dlhlSC的博客 1692

c语言switch虚线,C语言与汇编语言对照分析

游戏通常会包含各种各样的功能,如战斗系统、UI渲染、经济系统、生产系统等,每个系统又包含各式各样子功能,如伤害判定、施法、使用道具、角色移动、玩家之间交易等等。这些游戏功能在代码实现中往往少不了条件判断(如伤害判定)、循环(遍历物品列表,播放游戏动画)等。在逆向过程中如果可以从汇编语言识别出对应的语法结构,在分析过程中将汇编代码转换为C语言语法结构,可以帮助对程序执行流程的理解。下面分别介绍最常见...

weixin_30899991的博客 521

【YOLO11改进 - 注意力机制】SCSA通过结合空间注意力和通道注意力,提高各种下游视觉任务的性能。

【YOLO11改进 - 注意力机制】SCSA通过结合空间注意力和通道注意力,提高各种下游视觉任务的性能。

专注于图像领域,主要研究内容包括计算机视觉和深度学习,特别是在图像分类、目标检测和图像生成等方面有深入的研究和实践经验。 475

c语言什么叫对应语句,c语言控制语句对应的汇编语句代码

1、if-thenif-then语句的通用形式为:if (test-expr)then-statementelseelse-statement这里的test-expr是整型表达式,它的取值为0或者为非0。if-then语句对应的汇编实现形式为:t = test-expr;if (t)goto true;else-statementgoto done;ture:then-statementdone:...

weixin_39556474的博客 283

PyTorch深度学习实战(39)——少样本学习(Few-shot Learning)

小样本学习 (Few-shot Learning) 旨在解决在训练集中只有很少样本的情况下进行分类和推理的问题。在小样本学习中,我们希望通过利用已有的少量样本和先验知识来进行泛化,以便在面对新的、未见过的类别时能够做出准确的预测。这就要求模型能够从有限的训练样本中提取出有用的信息,并能够将这些信息应用到新类别的样本中去。在本节中,将介绍孪生、原型和关系网络的原理,并使用 PyTorch 实现孪生网络。

盼小辉丶的博客 1万+

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

快速识别汇编中等价的C语言语句(if, while, for, switch)

可能经常看汇编的朋友会一眼就认出跟C语言中一些语句等价的汇编代码, 经验使然也. 而不经常接触汇编的同学, 可能就对相对繁琐的寄存器操作指令有点云里雾里了. 汇编是编译器翻译中级语言(也可以把C语言称作高级语言, 呵呵)的结果, 只要是机器做的事儿,一般都有规律可循. 那我们现在就来看看一下这些基本语句的汇编规律吧. 注意:本文使用的汇编格式为GAS(Gnu ASembler GNU汇编...

weixin_33924770的博客 336

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

汇编 cmp_编程|控制结构(条件、循环)语句本质上是汇编指令cmp+JCC+jmp

CPU指令本质上是顺序执行的,但可以实现跳转(向后跳转可形成循环语句,后前跳转可形成选择分支语句)。1 条件选择语句与cmp和JCC汇编指令看C语句与对应的汇编代码:6: int a=3;00401578 mov dword ptr [ebp-4],37: int b=4;0040157F mov dword ptr [ebp-8],48: int max;9: if(b>a)0040158...

weixin_39620279的博客 661

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

流程控制语句反汇编(1)(Debug版)

// 流程控制语句反汇编 //Author:乾卦 Date:2014-5-8 #include<stdio.h> int main() { int a=1,b=10; if(a>b) { a=b; } a=2; b=11; return 0; } //if语句的反汇编...

weixin_30381317的博客 137

c语言三种循环语句的差异:汇编层面解释

c语言do-while,while,for三种循环语句的差异:汇编层面解释

m0_50955361的博客 651

8086汇编4位bcd码_编程|控制结构(条件、循环)语句本质上是汇编指令cmp+JCC+jmp...

CPU指令本质上是顺序执行的,但可以实现跳转(向后跳转可形成循环语句,后前跳转可形成选择分支语句)。1 条件选择语句与cmp和JCC汇编指令看C语句与对应的汇编代码:6: int a=3;00401578 mov dword ptr [ebp-4],37: int b=4;0040157F mov dword ptr [ebp-8],48: int max;9: if(b>a)0040158...

weixin_39901558的博客 340

《软件调试分析技术》学习笔记(八)

这两天学JAVA,没更新过了。。switch结构     C语言代码: #include int main() { int a = 1; switch (a) { case 0: a = 1; break; case 1: a = 0x10; break; case 2:

hacke2' Blog 1283

汇编代码详细解释:汇编语言如何转化为对应的C语言,怎么转化为对应的C代码?

摘要: 该文章详细解析了一个简单的Linux 32位汇编程序(NASM语法),其功能是向标准输出打印9个连续的星号"*"并退出。代码分为数据段(.data)和代码段(.text),通过times指令定义9个星号字符,并利用系统调用实现输出(s_write)和退出(s_exit)。文章对比了对应的C语言实现(使用printf函数),并详细解释了汇编与C语言在抽象层次上的差异:汇编直接操作寄存器与系统调用,而C语言通过标准库封装底层细节。

2301_80637449的博客 1513

汇编 c语言对应_C语言及汇编语言解析

什么是c语言:C语言是一门通用计算机编程语言,应用广泛。C语言的设计目标是提供一种能以简易的方式编译、处理低级存储器、产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言;尽管C语言提供了许多低级处理的功能,但仍然保持着良好跨平台的特性,以一个标准规格写出的C语言程序可在许多电脑平台上进行编译,甚至包含一些嵌入式处理器(单片机或称MCU)以及超级电脑等作业平台。什么是汇编语言:汇编语言(a...

weixin_39841709的博客 1789

汇编语言中循环语句的实现

一、概述 C语言中有许多不同的结构,比如if-else、do-while、while、for、swich等等,这些结构的汇编实现都是一层一层在前者的基础上进行构建的。比如if-else是基于jmp命令实现的,do-while是基于if-else的汇编结构的,而while又是基于do-while的。所以说jmp在汇编中有着特别重要的作用,它是实现多种C语言结构的基础。 二、jmp命令 三、

4万+

5分钟看懂汇编语言C语言

讲在前面~ 学习编程其实就是学高级语言,即那些为人类设计的计算机语言。 但是,计算机不理解高级语言,必须通过编译器转成二进制代码,才能运行。学会高级语言,并不等于理解计算机实际的运行步骤。 计算机真正能够理解的是低级语言,它专门用来控制硬件。汇编语言就是低级语言,直接描述/控制 CPU 的运行。如果你想了解 CPU 到底干了些什么,以及代码的运行步骤,就一定要学习汇编语言。 汇编语言不容易...

My 1万+
上一篇: c语言汇编
下一篇: x87FPU状态寄存器
mindview
博客等级 码龄19年 7粉丝 10原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值