首页 > 解决方案 > 在 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

我错过了什么?

标签: cassemblyx86-64nasm

解决方案


您正在 64 位程序中进行 32 位系统调用。

适用于 Linux,但前提是您的指针适合 32 位!他们可能不会(检查 的地址hello),否则您可能会得到 EFAULT(因为地址被截断,并且可能指向未映射的内存)。

进行 64 位系统调用

  • 为 64 位 ( rax, rdi, rsi, rdx)使用正确的寄存器

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

  • 使用syscall而不是int 0x80.


推荐阅读