使用NASM为x86_64环境编译32位程序集

时间:2016-04-14 17:06:37

标签: macos assembly x86 nasm

我正在阅读一本书,其中所有的汇编代码示例都是针对32位Linux环境编写的,而且我使用的是64位Mac。将_start更改为start后,我可以使用NASM编译以下程序。但是,当我运行可执行文件时,它并不像我期望的那样打印hello world。是否可以选择传递给NASM以便在64位Mac上运行的方式进行编译?

我试过了:

nasm -f macho32 helloworld.asm

nasm -f macho helloworld.asm

接下来是:

ld helloworld.o -o helloworld

我的代码是:

section .data       ; data segment
msg     db      "Hello, world!", 0x0a   ; the string and newline char

section .text       ; text segment
global start       ; Default entry point for ELF linking

start:
  ; SYSCALL: write(1, msg, 14) 
  mov eax, 4        ; put 4 into eax, since write is syscall #4
  mov ebx, 1        ; put 1 into ebx, since stdout is 1
  mov ecx, msg      ; put the address of the string into ecx
  mov edx, 14       ; put 14 into edx, since our string is 14 bytes
  int 0x80          ; Call the kernel to make the system call happen

  ; SYSCALL: exit(0)
  mov eax, 1        ; put 1 into eax, since exit is syscall #1
  mov ebx, 0        ; exit with success
  int 0x80          ; do the syscall

1 个答案:

答案 0 :(得分:2)

根本不会那样工作。获取VM并在VM中安装32位Linux。问题是没有在x64上运行x86_32代码。问题是在MAC上尝试Linux系统调用门。没有理由相信这会起作用。