有谁知道在 Mac 上编写程序集的任何好工具(我正在寻找 IDE)。Xcode 对我来说有点麻烦。
另外,在 Intel Mac 上,我可以使用通用 x86 asm 吗?还是有修改过的指令集?有关发布英特尔的任何信息。
另外:我知道在 Windows 上,asm 可以在操作系统创建的模拟环境中运行,让代码认为它在自己的专用机器上运行。OS X 是否提供相同的功能?
在安装了针对基于 Intel 的 Mac 的任何版本的 Xcode 后,您应该能够编写汇编代码。Xcode 是一套工具,其中只有一个是 IDE,所以如果您不想使用,则不必使用它。(也就是说,如果您发现某些特定的东西很笨拙,请在Apple 的 bug 报告员处提交错误- 每个错误都属于工程。)此外,安装 Xcode 将同时安装 Netwide Assembler (NASM) 和 GNU Assembler (GAS);这将让您使用您最熟悉的任何汇编语法。
您还需要查看Compiler & Debugging Guides,因为它们记录了用于 Mac OS X 运行的各种架构的调用约定,以及二进制格式和加载程序的工作方式。特别是 IA-32 (x86-32) 调用约定可能与您习惯的略有不同。
要记住的另一件事是,Mac OS X 上的系统调用接口与您在 DOS/Windows、Linux 或其他 BSD 风格上可能习惯的不同。系统调用在 Mac OS X 上不被视为稳定的 API;相反,您总是通过 libSystem。这将确保您编写的代码可从操作系统的一个版本移植到下一个版本。
最后,请记住,Mac OS X 运行在相当广泛的硬件上——从 32 位 Core Single 到高端四核 Xeon。通过在汇编中编码,您可能没有像您想象的那样优化;在一台机器上最佳的东西在另一台机器上可能是最差的。Apple 定期测量其编译器并使用“-Os”优化标志调整其输出以使其在整个产品线中体面,并且有广泛的矢量/矩阵处理库,您可以使用这些库通过手动调整的 CPU 特定实现获得高性能.
去集会很有趣。如今,为了速度而去组装并不适合胆小的人。
如前所述,不要使用系统调用。您可以使用标准 C 库调用,但请注意堆栈必须按照 Apple 的IA32 函数调用 ABI对齐 16 字节。
如果您不对齐堆栈,__dyld_misaligned_stack_error
当您调用任何库或框架时,您的程序将崩溃。
以下代码片段在我的系统上组装并运行:
; File: hello.asm
; Build: nasm -f macho hello.asm && gcc -o hello hello.o
SECTION .rodata
hello.msg db 'Hello, World!',0x0a,0x00
SECTION .text
extern _printf ; could also use _puts...
GLOBAL _main
; aligns esp to 16 bytes in preparation for calling a C library function
; arg is number of bytes to pad for function arguments, this should be a multiple of 16
; unless you are using push/pop to load args
%macro clib_prolog 1
mov ebx, esp ; remember current esp
and esp, 0xFFFFFFF0 ; align to next 16 byte boundary (could be zero offset!)
sub esp, 12 ; skip ahead 12 so we can store original esp
push ebx ; store esp (16 bytes aligned again)
sub esp, %1 ; pad for arguments (make conditional?)
%endmacro
; arg must match most recent call to clib_prolog
%macro clib_epilog 1
add esp, %1 ; remove arg padding
pop ebx ; get original esp
mov esp, ebx ; restore
%endmacro
_main:
; set up stack frame
push ebp
mov ebp, esp
push ebx
clib_prolog 16
mov dword [esp], hello.msg
call _printf
; can make more clib calls here...
clib_epilog 16
; tear down stack frame
pop ebx
mov esp, ebp
pop ebp
mov eax, 0 ; set return code
ret
最近想学习如何在 Mac OS X 上编译 Intel x86:
-o hello.tmp - outfile
-f macho - specify format
Linux - elf or elf64
Mac OSX - macho
-arch i386 - specify architecture (32 bit assembly)
-macosx_version_min 10.6 (Mac OSX - complains about default specification)
-no_pie (Mac OSX - removes ld warning)
-e main - specify main symbol name (Mac OSX - default is start)
-o hello.o - outfile
./hello.o - execution
nasm -o hello.tmp -f macho hello.s && ld -arch i386 -macosx_version_min 10.6 -no_pie -e _main -o hello.o hello.tmp && ./hello.o
让我知道这是否有帮助!
我在我的博客上写了如何做到这一点:
http://blog.burrowsapps.com/2013/07/how-to-compile-helloworld-in-intel-x86.html
对于更详细的解释,我在我的 Github 上进行了解释:
有关详细的 x86 Mac 专用介绍,请参阅http://peter.michaux.ca/articles/assembly-hello-world-for-os-x。我尝试过的其他链接有一些非 Mac 陷阱。
在 Mac 上运行汇编代码离您只有 3 步之遥。可以使用 XCODE 完成,但更好的是使用 NASM 命令行工具。为方便起见,我已经安装了 Xcode,如果您安装了 Xcode,那就太好了。
但是你也可以在没有 XCode 的情况下做到这一点。
只需关注:
brew install nasm
nasm -f macho64 myFile.asm
ld -macosx_version_min 10.7.0 -lSystem -o OutPutFile myFile.o && ./64
为方便起见,下面编写了名为 myFile.asm 的简单文本文件。
global start
section .text
start:
mov rax, 0x2000004 ; write
mov rdi, 1 ; stdout
mov rsi, msg
mov rdx, msg.len
syscall
mov rax, 0x2000001 ; exit
mov rdi, 0
syscall
section .data
msg: db "Assalam O Alaikum Dear", 10
.len: equ $ - msg
另外,在 Intel Mac 上,我可以使用通用 x86 asm 吗?还是有修改过的指令集?有关英特尔 Mac 组装后的任何信息都有帮助。
这是相同的指令集;这是相同的筹码。
可用的功能取决于您的处理器。苹果和其他人一样使用英特尔的东西。所以是的,通用 x86 应该没问题(假设你不在 PPC 上:D)。
就工具而言,我认为您最好的选择是“理解”汇编的优秀文本编辑器。
忘记寻找在 Mac 上编写/运行/编译汇编程序的 IDE。但是,记住 mac 是 UNIX。请参阅http://asm.sourceforge.net/articles/linasm.html。在 Linux 上通过 GCC 运行汇编程序的体面指南(虽然很短)。你可以模仿这个。Mac 使用 Intel 芯片,因此您想查看 Intel 语法。