先举例说如何访问C代码里的变量
c.c
-
int c_int = 13;
-
char *c_str = "hello, world#";
main.asm
-
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
挺简单的,就是在asm代码里extern导出这变量,就可以用了,但需要注意的是,c_str是指针这个变量的地址,
不是字符串的地址,所以要[]括起来。同样c_int也不能直接用。
下面举例如何在c代码和asm代码里互调函数
c.c
-
#include <stdio.h>
-
-
extern void asm_print();
-
void my_print(const char* str){
-
asm_print(str);
-
}
main.asm
-
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
汇编代码里如果想对外可见,则加个global修饰。
前面提到过第一个参数是通过rdi传入的,我们临时存储到r8里,因为rdi在调用syscall的时候还需要用,不能覆盖了。
这里为啥r8不需要[]了呢,我的解释是,rdi寄存器装的就是地址。
note:调用leave指令和调用下面的是一个结果,都是恢复栈顶和ebp
阅读(4282) | 评论(0) | 转发(0) |