调用C中的汇编函数



我试着在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位(raxrdirsirdx(使用正确的寄存器

  • 您需要使用64位系统调用编号(asm/unistd_64.h定义__NR_write1,如果可能,请考虑使用#include(。

  • 使用syscall而不是int 0x80

相关内容

  • 没有找到相关文章

最新更新