Linux 环境的的汇编器是 gas,也叫做 as,实际上 汇编器 as 的调试环境搭建,跟之前的 链接器的调试环境搭建非常类似的,因为 as
跟 ld
的代码都在 binutils 项目里面。阅读本文需要参考之前的 《编译系统-自底向上研究方法》用clion调试链接器ld源码 。
先讲一下 汇编器 as 这个命令怎么使用,main.s
的代码如下:
.file "main.c"
.text
.globl array
.data
.align 8
.type array, @object
.size array, 12
array:
.long 7
.long 5
.long 1
.text
.globl main
.type main, @function
main:
.LFB0:
.cfi_startproc
pushq %rbp
.cfi_def_cfa_offset 16
.cfi_offset 6, -16
movq %rsp, %rbp
.cfi_def_cfa_register 6
subq $16, %rsp
movl $3, %esi
leaq array(%rip), %rdi
call sum@PLT
movl %eax, -4(%rbp)
movl $8, %eax
movl -4(%rbp), %eax
movl %ebx, %eax
movl %eax, -4(%rbp)
leave
.cfi_def_cfa 7, 8
ret
.cfi_endproc
.LFE0:
.size main, .-main
.ident "GCC: (Ubuntu 7.5.0-3ubuntu1~18.04) 7.5.0"
.section .note.GNU-stack,"",@progbits
可以用以下命令 将 ASII 码转成 二进制指令。
as -o main-new.o main.s
下面开始搭建 clion
的 as 调试环境,还是要下载 binutils
的源码自己编译出来 as 命令,这样才有符号表 源码调试。一些操作步奏请看 《编译系统-自底向上研究方法》用clion调试链接器ld源码 。
下面开始操作。
第一步:直接添加一个 Make Application,如下图:
注意上面我圈出来的内容,要按照自己的环境调整。因为我知道他生成的 as 命令路径是 gas/as-new
。
第二步:点击右上角的运行按钮,可以正确生成 main-new.o
文件就没问题了。
第三步:在 as.c
文件的 main
函数入口打个断点,开始断点调试。
至此, 汇编器 gas 的调试环境已经搭建成功了。
汇编器的内容,本书就讲解完毕了,汇编器的内部逻辑,如何扫描文本字符串,如何解析,读者断点调试一下就知道了。断点调试是一个非常重要的技能,市面上的编译书籍,很多概念思路会看得云里雾里,但是如果你把一个调试环境搭建起来,一步一步调试,就很容易看懂那些经典书籍在讲什么。
由于笔者的水平有限, 加之编写的同时还要参与开发工作,文中难免会出现一些错误或者不准确的地方,恳请读者批评指正。如果读者有任何宝贵意见,可以加我微信 Loken1,QQ:2338195090。