运行 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。
你这里有两个问题。
您正在将汇编文件编译为 ELF 二进制文件 (-f elf
),Mac OS X ld
不支持.使用 -f macho
为您的系统生成 Mach-O 目标文件,然后使用 -arch i386
到 link 它作为 32 位二进制文件。
您正在尝试在 Mac OS X 上使用 Linux 系统调用。这不起作用;系统调用号码和调用约定不同,并且没有公开记录。解决这个问题是可能的,但是,正如 Frank Kotler 提到的,我不建议初学者完成这项任务;最好的办法是使用 32 位 Linux 系统来完成这些教程。
我在 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。
你这里有两个问题。
您正在将汇编文件编译为 ELF 二进制文件 (
-f elf
),Mac OS Xld
不支持.使用-f macho
为您的系统生成 Mach-O 目标文件,然后使用-arch i386
到 link 它作为 32 位二进制文件。您正在尝试在 Mac OS X 上使用 Linux 系统调用。这不起作用;系统调用号码和调用约定不同,并且没有公开记录。解决这个问题是可能的,但是,正如 Frank Kotler 提到的,我不建议初学者完成这项任务;最好的办法是使用 32 位 Linux 系统来完成这些教程。