我在运行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吗?或者程序本身编写不正确。谢谢你的帮助!
答案 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)
这里有两个问题。
您正在将程序集文件编译为ELF二进制文件(-f elf
),Mac OS X ld
不支持该文件。使用-f macho
为系统生成Mach-O目标文件,然后使用-arch i386
将其链接为32位二进制文件。
您正在尝试在Mac OS X上使用Linux系统调用。这不起作用;系统调用号码和调用约定是不同的,并且没有公开记录。解决这个问题是可能的,但正如Frank Kotler所提到的那样,这不是我为初学者推荐的任务;您最好的选择是使用32位Linux系统来完成这些教程。