我试着在C中调用我用Nasm编写的汇编函数。由于某些原因,事情没有像我预期的那样运行。
NASM:
SECTION .DATA
hello: db 'Hello', 0x0a ; Hello/n
SECTION .TEXT
global sayHello
sayHello:
mov rax, 4 ; write()
mov rbx, 1 ; stdout
mov rcx, hello ; add hello to register
mov rdx, 6 ; length of string
int 0x80 ; interrupt
ret ; return
C:
#include <stdio.h>
extern int sayHello();
int main(int argc, char **argv) {
printf("ASM Function is saying Hello:n");
sayHello();
return 0;
}
使用:nasm-f elf64和gcc 编译
结果:
ASM Function is saying Hello:
预期结果:
ASM Function is saying Hello:
Hello
我错过了什么?
您正在64位程序中进行32位系统调用。
在Linux上运行,但前提是您的指针适合32位!它们可能不(检查hello
的地址(,否则您可能会得到EFAULT(因为地址被截断,可能指向未映射的内存(。
进行64位系统调用
-
为64位(
rax
、rdi
、rsi
、rdx
(使用正确的寄存器 -
您需要使用64位系统调用编号(
asm/unistd_64.h
定义__NR_write
1,如果可能,请考虑使用#include
(。 -
使用
syscall
而不是int 0x80
。