首页 > 作文

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

更新时间:2023-04-03 22:39:51 阅读: 评论:0

1. 要编译的测试代码:

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

2. 词法分析

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

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

3. 语法分析

if (equal(to小孩子的睡前故事k, "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, "el"))      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语句还有e作比较造句l部分,则调用stmt处理el语句块中的语句,这里是处理”b = 5;”,将解析结果存储在node->els。

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

4. 代码生成

switch (node->kind) {  ca nd_if: {    int c = count();    gen_expr(node->cond);    cmp_zero(node->cond->ty);   平面图形创意画 println("  je  .l.el.%d", c);    gen_stmt(node->then);    println("  jmp .l.end.%d", c);    println(".l.el.%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.el.%d”, c);

该语句会生成汇编代码” je .l.el.1″,当上条比较语句中eax为0时会执行跳转,跳转到el分支运行。这里由于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.el.%d:”, c);

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

4.7 gen_stmt(node->els);

生成el分支代码,处理”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分支语句执行完成后跳转到这里。

本文发布于:2023-04-03 22:39:49,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/zuowen/d32c0844a7e90e94388d57ab6d1d89a1.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

本文word下载地址:c语言中if语句是怎么变成汇编代码的详解.doc

本文 PDF 下载地址:c语言中if语句是怎么变成汇编代码的详解.pdf

标签:语句   寄存器   分支   代码
相关文章
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图