运行 64 位处理器上的 32 位汇编 mac os x

run 32 bit assembly on 64 bit processor with mac os x

我在 64 位 mac 运行ning os x 10.9.5 上使用 运行ning 32 位汇编时遇到问题。我还安装了 NASM 2.11.08。我目前正在阅读 Jeff Duntemann 的《Assembly Language Step by Step》。在书中,他指定了在 linux 操作系统上进行 32 位汇编的说明。如何在我的 64 位 mac os x 计算机上 运行 这个程序。

; eatsyscall.asm

SECTION .data           ; Section containing initialised data
EatMsg: db "Eat at Joes!",10
EatLen: equ $-EatMsg    

SECTION .bss            ; Section containing uninitialized data 

SECTION .text           ; Section containing code

global  _start          ; Linker needs this to find the entry point!

_start:
    nop         ; This no-op keeps gdb happy...
    mov eax,4       ; Specify sys_write call
    mov ebx,1       ; Specify File Descriptor 1: Standard Output
    mov ecx,EatMsg      ; Pass offset of the message
    mov edx,EatLen      ; Pass the length of the message
    int 80H         ; Make kernel call

    MOV eax,1       ; Code for Exit Syscall
    mov ebx,0       ; Return a code of zero 
    int 80H         ; Make kernel call

我试过用

组装它
nasm -f elf -g -F stabs eatsyscall.asm

然后我尝试 link 它

ld -o eatsyscall eatsyscall.o

但是我收到这个错误

ld: warning: -arch not specified
ld: warning: -macosx_version_min not specified, assuming 10.6
ld: warning: ignoring file eatsyscall.o, file was built for unsupported file format ( 0x7F 0x45 0x4C 0x46 0x01 0x01 0x01 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 ) which is not the architecture being linked (x86_64): eatsyscall.o
Undefined symbols for architecture x86_64:
  "start", referenced from:
     implicit entry/start for main executable
ld: symbol(s) not found for inferred architecture x86_64

这个应该运行吧?我认为 Intel 的 64 位处理器能够 运行ning 32 位程序。或者没有办法 运行 在 64 位 mac 上为 32 位 linux 系统编写的汇编程序吗?

我是否需要安装一些 32 位库集才能 link 这个文件?我应该使用 NASM 以外的东西,比如 GCC 吗?还是程序本身写的不对。感谢您的帮助!

Linux 的可执行文件在 Mac 期间不会 运行。如果您想 运行 Jeff Duntemann 的东西,请在 Mac 上的虚拟机上安装 Linux。代码可以很容易地翻译成 -f macho64,但是在 -f macho64 上的 Nasm-2.11.08 中有一个严重的错误 :(

有一个候选版本 - http://www.nasm.us/pub/nasm/releasebuilds/2.11.09rc1/macosx/ - "may" 修复了它。需要有人来测试它。对于初学者来说可能不是一件好事。您应该能够使用 Mac 使用 gcc 进行编程,但不能使用 "Step by Step"。 Nasm 将在您的 Mac 上工作...但不是现在...如果可以,请暂时安装 Linux。

你这里有两个问题。

  1. 您正在将汇编文件编译为 ELF 二进制文件 (-f elf),Mac OS X ld 不支持.使用 -f macho 为您的系统生成 Mach-O 目标文件,然后使用 -arch i386 到 link 它作为 32 位二进制文​​件。

  2. 您正在尝试在 Mac OS X 上使用 Linux 系统调用。这不起作用;系统调用号码和调用约定不同,并且没有公开记录。解决这个问题是可能的,但是,正如 Frank Kotler 提到的,我不建议初学者完成这项任务;最好的办法是使用 32 位 Linux 系统来完成这些教程。