交流
商城
MCN
登入
注册
首页
提问
分享
讨论
建议
公告
动态
发表新帖
发表新帖
第三节 C语言与汇编的对应
分享
未结
0
836
李延
LV6
2022-06-07
悬赏:20积分
# 1 本章内容 前面我们了解了基本的汇编命令,在这一章节中,我们通过c语言,查看每种情况在汇编语言中的对应关系 # 2 编码的基本原则 这一章节,我们主要是编写c语言代码,然后通过gcc 编译器,讲代码编译为汇编,来查看c语言与汇编的对应关系,但gcc往往会在这个编译过程中进行优化,导致我们想观察的一些内容无法展示。所以我们需要通过一些几种方式,来避免这种优化 假如我们想观察c语言的加法操作在汇编中是如何实现的,我们可能会进行写下面的代码: ```c int main() { int a =1; int b =2; int c = a+b; return 0; } ``` 我们对这个c语言进行编译 ```shell gcc -S -Og main.c ``` 结果如下: ```asm .file "main.c" .text .globl main .type main, @function main: .LFB0: .cfi_startproc movl $0, %eax ret .cfi_endproc .LFE0: .size main, .-main .ident "GCC: (GNU) 4.8.5 20150623 (Red Hat 4.8.5-44)" .section .note.GNU-stack,"",@progbits ``` 我们发现 main函数什么也没有干,直接返回0. 这是因为gcc在编译时发现,变量c没有使用,对应的` int c = a+b;`也就没有执行的必要,所以就干脆删除,而删除掉变量c后,a和b也就没有使用,所以就相当于main函数直接返回0了。 为了避免这种情况,我们就需要让我们声明的变量都使用起来,对于上面的情况我们可以把c当作main函数的返回值或者调用printf函数,打印变量c。如: ```c int main() { int a =1; int b =2; int c = a+b; return c; } ``` 当我们讲代码如上面的情况,将c返回后,再编译结果如下: ```asm .file "main.c" .text .globl main .type main, @function main: .LFB0: .cfi_startproc movl $3, %eax ret .cfi_endproc .LFE0: .size main, .-main .ident "GCC: (GNU) 4.8.5 20150623 (Red Hat 4.8.5-44)" .section .note.GNU-stack,"",@progbits ``` 这是,我们看到确实如我们所想的那样,将结果3进行了,返回。 但有出了一个新的问题。因为a和b是固定的,所以c的值永远是3。编译器直接在编译时就将结果计算出来,避免在代码执行时重复计算,所以我们还是没有得到我们想要的结果。 这种情况,我们可以将a+b单独写一个函数,在main方法中进行调用。如: ```asm int sum(int a, int b) { return a+b; } int main() { return sum(1, 2); } ``` 我们再进行编译 ```asm .file "main.c" .text .globl sum .type sum, @function sum: .LFB0: .cfi_startproc leal (%rdi,%rsi), %eax ret .cfi_endproc .LFE0: .size sum, .-sum .globl main .type main, @function main: .LFB1: .cfi_startproc movl $2, %esi movl $1, %edi call sum rep ret .cfi_endproc .LFE1: .size main, .-main .ident "GCC: (GNU) 4.8.5 20150623 (Red Hat 4.8.5-44)" .section .note.GNU-stack,"",@progbits ``` 这样我们终于得到计算a+b的过程 ```asm leal (%rdi,%rsi), %eax ```
回帖
消灭零回复
提交回复
热议榜
java 相关知识分享
8
好的程序员与不好的程序员
6
写给工程师的十条精进原则
5
spring boot以jar包运行配置的logback日志文件没生成
5
一步一步分析SpringBoot启动源码(一)
5
MockMvc测试
5
【吐槽向】是不是有个吐槽的板块比较好玩
4
logstash jdbc同步mysql多表数据到elasticsearch
3
IntelliJ IDEA 优质License Server
3
.gitignore忽略规则
3
SpringBoot启动源码分析
3
一步一步分析SpringBoot启动源码(三)
3
2
一步一步分析SpringBoot启动源码(二)
2
积分不够将无法发表新帖
2
官方产品
Meta-Boot - 基于MCN
MCN - 快速构建SpringBoot应用
微信扫码关注公众号