c.c
- int c_int = 13;
- char *c_str = "hello, world#";
- extern c_int;
- extern c_str;
-
- section .data
- message:
- db 'hello, world!', 0
- section .text
- global _start
- _start:
- mov rax, 4
- mov rdi, 1
- mov rsi, [c_str]
- mov rdx, [c_int]
- syscall
- mov rax, 1
- xor rdi, rdi
- syscall
不是字符串的地址,所以要[]括起来。同样c_int也不能直接用。
下面举例如何在c代码和asm代码里互调函数
c.c
- #include <stdio.h>
- extern void asm_print();
- void my_print(const char* str){
- asm_print(str);
- }
- extern my_print
- section .data
- message:
- db 'hello, world!', 0
- section .text
- global asm_print
- asm_print:
- push rbp
- mov rbp, rsp
- mov r8, rdi
- mov rax, 4
- mov rdi, 1
- mov rsi, r8
- mov rdx, 13
- syscall
- leave
- ret
- global _start
- _start:
- mov rdi, message
- call my_print
- mov rax, 1
- xor rdi, rdi
- syscall
前面提到过第一个参数是通过rdi传入的,我们临时存储到r8里,因为rdi在调用syscall的时候还需要用,不能覆盖了。
这里为啥r8不需要[]了呢,我的解释是,rdi寄存器装的就是地址。
note:调用leave指令和调用下面的是一个结果,都是恢复栈顶和ebp
- mov esp,ebp
- pop ebp