返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >c语言中if语句是怎么变成汇编代码的详解
  • 135
分享到

c语言中if语句是怎么变成汇编代码的详解

2024-04-02 19:04:59 135人浏览 独家记忆
摘要

目录 1. 要编译的测试代码: 2. 词法分析3. 语法分析4. 代码生成4.1 gen_expr4.2 cmp_zero4.3 println(" je .L.else.%d",

 1. 要编译的测试代码: 


int a;
int b = 3;

int main(void)
{
    if (3)
        a = 4;
    else
        b = 5;
}

2. 词法分析

  词法分析将c源代码解析成一个个的token。

  关键的,将if两个字符解析成一个if token,后续语法分析的输入就从两个字符减少为1个token,减小了语法分析的难度。

3. 语法分析


if (equal(tok, "if")) {
    Node *node = new_node(ND_IF, tok);
    tok = skip(tok->next, "(");
    node->cond = expr(&tok, tok);
    tok = skip(tok, ")");
    node->then = stmt(&tok, tok);
    if (equal(tok, "else"))
      node->els = stmt(&tok, tok->next);
    *rest = tok;
    return node;
  }

如果当前处理的token是if,则

3.1 创建新的类型为ND_IF的node。

3.2 跳过if后面的"("。

3.3 调用expr函数解析if语句()中的表达式,并将解析结果存储在node->cond。

3.4 跳过“)”。

3.5 调用stmt处理then语句块中的语句,这里是处理"a = 4;",将解析结果存储在node->then。

3.6 如果if语句还有else部分,则调用stmt处理else语句块中的语句,这里是处理"b = 5;",将解析结果存储在node->els。

3.7 node->cond,node->then,node->els都为node节点。

4. 代码生成


switch (node->kind) {
  case ND_IF: {
    int c = count();
    gen_expr(node->cond);
    cmp_zero(node->cond->ty);
    println("  je  .L.else.%d", c);
    gen_stmt(node->then);
    println("  jmp .L.end.%d", c);
    println(".L.else.%d:", c);
    if (node->els)
      gen_stmt(node->els);
    println(".L.end.%d:", c);
    return;
  }
...

如果当前处理的node节点类型为ND_IF,则

4.1 gen_expr

这个函数处理if语句的条件部分,这里是处理3。判断node节点为NUM,会生成汇编语句"mov     rax, 3",将3载入rax寄存器。

4.2 cmp_zero

cmp_zero会生成汇编语句"cmp     eax, 0",比较3和0。

4.3 println(" je .L.else.%d", c);

该语句会生成汇编代码" je .L.else.1",当上条比较语句中eax为0时会执行跳转,跳转到else分支运行。这里由于eax为3,所以不跳转。

4.4 gen_stmt(node->then);

这条语句会将then分支中的语句解析为汇编源码,这里是"a = 4;",这条语句是表达式语句,所以会调用gen_expr函数。

4.4.1 gen_expr

"lea     rax, a",将a的地址载入rax寄存器中。

"push rax",将rax入栈。

"mov     rax, 4",将4载入rax寄存器中。

"pop     rdi",将变量a的地址载入rdi寄存器。

"mov     [rdi], eax",将4写入变量a。 

4.5 println(" jmp .L.end.%d", c);

执行完then分支代码后跳转到下一条语句处执行。

4.6 println(".L.else.%d:", c);

插入一条标签,表示else分支代码的开始,如果if语句条件为0会跳转到这。

4.7 gen_stmt(node->els);

生成else分支代码,处理"b = 5;"。

"lea     rax, b",将变量b的地址载入rax寄存器。

"push    rax",将rax寄存器入栈。

"mov     rax, 5",将5载入rax寄存器。

"pop     rdi",将b的地址载入rdi寄存器。

"mov     [rdi], eax",将5写入变量b中。

4.8 println(".L.end.%d:", c);

插入一条标签,表示if语句的结束,then分支语句执行完成后跳转到这里。

总结

到此这篇关于C语言中if语句是怎么变成汇编代码的文章就介绍到这了,更多相关c语言if语句变成汇编代码内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: c语言中if语句是怎么变成汇编代码的详解

本文链接: https://lsjlt.com/news/158187.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • c语言中if语句是怎么变成汇编代码的详解
    目录 1. 要编译的测试代码: 2. 词法分析3. 语法分析4. 代码生成4.1 gen_expr4.2 cmp_zero4.3 println(" je .L.else.%d", ...
    99+
    2024-04-02
  • C语言中调用汇编语言详解
    目录1.建立新工程2.改写程序3.总结1.建立新工程 首先点击Project里面的 New uVision Project 然后输入文件名,点击保存即可。 在你命名的project中...
    99+
    2024-04-02
  • C语言中if语句的使用是怎样的
    本篇文章给大家分享的是有关C语言中if语句的使用是怎样的,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。if语句:作用:构成分支结构。(它根据给定的条件进行判断,以决定执行某个分...
    99+
    2023-06-29
  • C语言详细讲解if语句与switch语句的用法
    目录一、if 语句二、switch 语句三、错误提示一、if 语句 格式: if(写条件){输出内容}条件为真运行这个。 else {输出内容}否则输出这个。 代码: #includ...
    99+
    2024-04-02
  • C语言的if else语句怎么使用
    本篇内容介绍了“C语言的if else语句怎么使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!1、前言(1)C语言是结构化的程序...
    99+
    2023-07-02
  • 高级语言中的语句在汇编中是怎么实现的
    这篇文章主要介绍“高级语言中的语句在汇编中是怎么实现的”,在日常操作中,相信很多人在高级语言中的语句在汇编中是怎么实现的问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”高级语言中的语句在汇编中是怎么实现的”的疑...
    99+
    2023-06-15
  • c++中的if语句怎么用
    c++ 的 if 语句是一种条件语句,用于判断某个条件是否为真后执行相应的代码块。语法包括:if (condition) {}:condition 为布尔表达式,决定代码块是否执行。可以...
    99+
    2024-05-10
    c++
  • c#中的if语句怎么用
    答案: c# 中的 if 语句是一个条件语句,用于根据给定的条件控制程序流程。详细描述:语法:if (condition){ / 如果条件为真,执行这些语句 / }条件:布尔表达式,求值...
    99+
    2024-05-11
    c#
  • 汇编语言和c语言的区别是什么
    区别:1、因为汇编语言实质上是机器语言的助记符,是直接面对CPU的语言,所以汇编语言的运行效率比C语言高;2、汇编语言对硬件的可操控性强,C语言硬件可操控性比较差;3、汇编语言的目标代码体积小,C语言目标代码体积大;4、汇编语言不易维护,C...
    99+
    2023-05-14
    汇编语言 C语言
  • C语言编程中if的用法是什么
    C语言编程中if的用法是什么,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。顺序,选择和循环是程序的三大基本结构,无论多么复杂的程序,都是用这三种结构写出来的。i...
    99+
    2023-06-03
  • c语言中helloworld怎么编写代码
    在 c 语言中,编写 "hello, world!" 程序的步骤包括:创建源文件 "hello.c"。包含头文件 。定义主函数 main()。使用 printf() 输出 "hello,...
    99+
    2024-04-05
    c语言
  • C++中的If Else语句怎么使用
    这篇文章主要介绍“C++中的If Else语句怎么使用”,在日常操作中,相信很多人在C++中的If Else语句怎么使用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C++中的If Else语句怎么使用”的疑...
    99+
    2023-06-15
  • R语言中if(){}else{}语句和ifelse()函数的区别详解
    首先看看定义: # if statement if(cond) expr if(cond) cons.expr else alt.expr # ifelse functio...
    99+
    2024-04-02
  • c语言中怎么实现qp编解码
    本篇文章给大家分享的是有关c语言中怎么实现qp编解码,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。 void DecodeQP(ngx_str_t *des...
    99+
    2023-06-04
  • Go语言代码转C语言的实现方法详解
    随着计算机科技的快速发展,编程语言也在不断涌现。其中,Go语言因其简洁、高效和并发性能而备受关注。然而,在某些特定的场景下,我们可能需要将Go语言代码转换为C语言,以提高性能或兼容性。...
    99+
    2024-03-07
    代码实现 转换方法 go到c go语言
  • c语言中goto语句的用法是什么
    在C语言中,goto语句用于无条件地将控制转移到程序中的标记位置。其基本语法如下: goto label; 其中,label是一个...
    99+
    2024-02-29
    c语言
  • c语言中的switch语句怎么使用
    在C语言中,switch语句用于根据不同的情况执行不同的操作。其基本语法如下: switch (expression) { ...
    99+
    2024-04-02
  • 汇编语言中assume的作用是什么
    本篇文章给大家分享的是有关汇编语言中assume的作用是什么,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。assume 的作用是关联段名与段寄存器。如果你在数据段中定义了变量名...
    99+
    2023-06-25
  • 用c语言编写一个通讯录代码详解
    目录实现通讯录的思路如下:总结实现通讯录的思路如下: 1.程序运行起来时用户首先要看到菜单栏选项并且对应菜单栏所给出的选项做出选择,这里我们简单设计一个Menu()函数可以让用户看见...
    99+
    2024-04-02
  • c语言代码出错怎么解决
    解决 c 语言代码出错的方法包括:检查语法错误(通过编译器)检查逻辑错误(通过调试)检查运行时错误(通过程序输出或调试器)检查内存泄漏(通过内存分析工具)检查未定义行为(遵循 c 语言标...
    99+
    2024-04-13
    c语言
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作