MacOS Arm64 汇编 part 4 - MacOS Arm64 Assembly part 4
- Interacting with C
- Call C functions & Call a assmebly function from C
- Inline assembly in C
Using printf in asm
首先我们来实现由汇编到 C 语言函数的调用,其中最常用的一个就是 printf
1 | .global _start |
由于 sp 严格 16-bytes align,因此就算只有 8
bytes,我们也采用 16 bytes 的栈指针偏移,printf 在
clang 语法下需要加下划线,第一个参数采用 X0
传递,而后续参数均采用压栈方式来传递,需要注意的一点是参数栈需要调用者自行释放
Using asm function in C
使用汇编中的函数也比较简单,extern 声明一下就行
1 | .global _add |
1 |
|
Packaging Our Code
Static Library
通过 ar 命令实现静态链接库的打包
1 | ar -cvq libadd.a add.o |
在与 C 一同编译时
1 | clang -o add2 add.c libadd.a |
Embedding Assembly Code Inside C Code
我们仍可以在 C 语言中使用汇编
1 |
|
其中前两行是加法计算以及结果拷贝到输出寄存器,实际可以移步到到位,通过
\n 分隔两行汇编代码。
- 1st
:用于指定输出变量,寄存器默认编号为%0- 2nd
:用于指定输入变量,寄存器默认编号从%1开始依次递增,逗号分隔两个输入- 3rd
:用于说明使用的(破坏掉的)寄存器列表,逗号分隔