Chr*_*son 74
在安装面向基于Intel的Mac的任何Xcode版本后,您应该能够编写汇编代码.Xcode是一套工具,其中只有一个是IDE,因此如果您不想使用它,则不必使用它.(也就是说,如果有特定的东西你发现笨重,请向Apple的bug报告者提交一个错误- 每个bug都归工程.)此外,安装Xcode将同时安装Netwide Assembler(NASM)和GNU Assembler(GAS); 这将允许您使用您最熟悉的任何汇编语法.
您还需要查看编译器和调试指南,因为它们记录了运行Mac OS X的各种体系结构的调用约定,以及二进制格式和加载器的工作方式.特别是IA-32(x86-32)呼叫约定可能与您习惯的略有不同.
要记住的另一件事是Mac OS X上的系统调用界面与您在DOS/Windows,Linux或其他BSD版本上使用的界面不同.系统调用在Mac OS X上不被视为稳定的API; 相反,你总是通过libSystem.这将确保您编写可从一个OS版本移植到下一个版本的代码.
最后,请记住,Mac OS X运行的是各种各样的硬件 - 从32位Core Single到高端四核Xeon.通过汇编编码,您可能没有像您想象的那样进行优化; 在一台机器上最佳的可能在另一台机器上是最小的.Apple定期测量其编译器并使用"-Os"优化标志调整其输出,以便在整个生产线上保持良好状态,并且有大量的矢量/矩阵处理库可用于通过手动调整的CPU特定实现来获得高性能.
去装配乐趣很棒.如今,为了速度而去集会并不适合胆小的人.
小智 29
如前所述,不要使用系统调用.您可以使用标准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
Run Code Online (Sandbox Code Playgroud)
最近我想学习如何在Mac OS X上编译Intel x86:
-o hello.tmp - outfile
-f macho - specify format
Linux - elf or elf64
Mac OSX - macho
Run Code Online (Sandbox Code Playgroud)
-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
Run Code Online (Sandbox Code Playgroud)
./hello.o - execution
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
如果这有帮助,请告诉我!
我在博客上写了如何做到这一点:
http://blog.burrowsapps.com/2013/07/how-to-compile-helloworld-in-intel-x86.html
为了更详细的解释,我在我的Github上解释说:
https://github.com/jaredsburrows/Assembly
有关x86 Mac特定介绍的详细步骤,请参阅http://peter.michaux.ca/articles/assembly-hello-world-for-os-x.我试过的其他链接有一些非Mac的陷阱.
另外,在 Intel Mac 上,我可以使用通用的 x86 asm 吗?或者是否有修改后的指令集?任何有关后英特尔 Mac 组装的信息都有帮助。
这是相同的指令集;这是相同的芯片。
在Mac上运行汇编代码距离您只有3步之遥.它可以使用XCODE完成,但更好的是使用NASM命令行工具.为了我的轻松,我已经安装了Xcode,如果你已经安装了Xcode.
但是你也可以在没有XCode的情况下做到这一点.
请关注:
brew install nasmnasm -f macho64 myFile.asmld -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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
102579 次 |
| 最近记录: |