Post

Compile an integer to an exectuable that exits with the given number

开篇通.个人学习rui314大佬的chibicc笔记。

这一节是通过c语言用printf打印出汇编代码。可能是为了简化chibicc没有后端,生成的中间代码是汇编,再通过汇编器(as)生成可执行文件。

这个系列同时参考了rvcc,每节同时附带上RISC-V 64的汇编。由于我的环境是mac不保证运行正确😂

知识点

一.clang命令行参数

  • 编译c文件:clang file -o output
  • 编译汇编文件:clang file -o output

在mac下需要将段 main 修改成 _main,不然会出现【Undefined symbols for architecture x86_64: “_main”】错误

二.C知识点

  • 1.main函数的入参
1
2
3
4
int main(int argc,char **argv){
    //argc:入参个数
    //argv:参数.而argv[0]为程序名称
}
  • 2.atoi函数:将字符串转换为数字

三.汇编知识

1
2
3
4
.intel_syntax noprefix ; Intel 语法的指令
.global main           ; 声明全局段,程序入口
main:                  ; 对应global声明的main段标签
;...
  • 1.x86汇编

以r开头的是64位寄存器,如 rax 、 rbx 等。

以e开头的是32位寄存器,如 eax 、 ebx(还是十几年前用过)。

在32位中eax默认当作函数的返回值寄存器,相同的64位是rax。

  • 2.RISC-V 汇编
1
2
li a0,999 ;li指令位加载立即数刀寄存器a0,相当于x86的move
;a0 默认当作函数的返回值寄存器

四.cnmake

  • 好吧mac环境没有cnmake得安装
    • (下载)[https://links.jianshu.com/go?to=https%3A%2F%2Fcmake.org%2Fdownload%2F]
    • 添加命令行

      打开cmake,点击菜单栏的 Tools -> How to Install For Command Line Use 拷贝”sudo “/Applications/CMake.app/Contents/bin/cmake-gui” –install”

      终端中执行拷贝的命令

  • 使用
1
2
3
4
5
6
7
8
9
10
11
12
#1.创建一个编译文件目录
cmake -Bbuild 

#2.编译
cd build/
make

#3.执行编译程序
./chibicc 66

#4.清理编译的文件
rm -r build

成果

通过c程序输入一个数字参数x,产生一个汇编文件,这个汇编编译后程序运行输出的就是x.

下面是汇编代码:

1.x86

1
2
3
4
5
.intel_syntax noprefix
.global _main       ;mac下main要加下划线
_main:
  mov rax, 66
  ret

2.RISC-V

1
2
3
4
.global main      
main:
  li a0, 66
  ret
This post is licensed under CC BY 4.0 by the author.