使用mac os x在64位处理器上运行32位汇编

时间:2015-10-14 04:02:12

标签: macos assembly 64-bit x86-64 32-bit

我在运行os x 10.9.5的64位mac上运行32位汇编时遇到问题。我也安装了NASM 2.11.08。我目前正在阅读Jeff Duntemann的汇编语言。在本书中,他指定了在Linux操作系统上进行32位汇编的指令。如何在我的64位mac os x计算机上运行该程序。

Runtime rn = Runtime.getRuntime();
Process proc; 
proc = rn.exec("cmd /c start /script/restart.bat"); 
proc.waitFor();

我尝试用

组装它
; 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

但我收到此错误

ld -o eatsyscall eatsyscall.o

这应该运行,对吗?我认为英特尔的64位处理器能够运行32位程序。或者是否无法在64位mac上运行为32位Linux系统编写的汇编程序?

我是否需要安装一些32位库才能链接此文件?我应该使用除NASM之外的其他东西,如GCC吗?或者程序本身编写不正确。谢谢你的帮助!

2 个答案:

答案 0 :(得分:1)

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/ - “可能”修复它。有人需要测试它。对初学者来说也许不是一份好工作。你应该可以在Mac上使用gcc进行编程,但不能使用“Step by Step”。 Nasm将在你的Mac上工作......但现在不行......如果可以的话,现在安装Linux。

答案 1 :(得分:0)

这里有两个问题。

  1. 您正在将程序集文件编译为ELF二进制文件(-f elf),Mac OS X ld不支持该文件。使用-f macho为系统生成Mach-O目标文件,然后使用-arch i386将其链接为32位二进制文​​件。

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