有没有人知道在Mac上写汇编语言的好工具(我正在寻找IDE),因为Xcode对我来说有点繁琐。
另外,在Intel Mac上,我能否使用通用的x86汇编语言?还是有修改过的指令集?有任何关于后Intel的信息吗?
还有:我知道在Windows上,汇编语言可以在由操作系统创建的模拟环境中运行,让代码认为它在运行自己专用的机器。OS X是否提供相同的功能?
最后,请记住,Mac OS X可以运行在各种硬件上 - 从32位Core Single到高端四核Xeon。通过汇编编码,您可能没有像您想象的那样进行优化;在一台机器上最优的东西,在另一台机器上可能是最劣的。苹果公司定期测量其编译器,并使用“-Os”优化标志调整其输出,使其在线路上表现良好,并且有广泛的矢量/矩阵处理库,您可以使用手动调整的CPU特定实现来获得高性能。
为了好玩而使用汇编很棒。但是出于速度考虑去使用汇编对于现在的人来说并不容易。
如前所述,请勿使用syscall。您可以使用标准的C库调用,但请注意栈必须按照苹果的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上解释了:
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
-macosx_version_min 10.14.1
,则会出现以下错误:Undefined symbols for architecture x86_64:
"_main", referenced from:
implicit entry/start for main executablesymbol(s) not found for inferred architecture x86_64 - gabbler对于英特尔架构的 Mac,我能使用通用的 x86 汇编语言吗?还是必须使用修改过的指令集?如果有关于英特尔 Mac 后期汇编的信息也请提供。
实际上,它们使用的是相同的指令集和芯片。
可用的功能取决于您的处理器。苹果使用与其他人相同的英特尔芯片。因此,是的,通用的x86应该没问题(假设您不在PPC上:D)。
就工具而言,我认为您最好的选择是一个能够“理解”汇编语言的好文本编辑器。
别再为在Mac上寻找汇编语言的IDE而烦恼了。但是,记住Mac是UNIX系统。请参考http://asm.sourceforge.net/articles/linasm.html。这是一个不错的(虽然简短)指南,教你如何通过GCC在Linux上运行汇编语言。你可以仿照这个方法在Mac上操作。由于Mac使用Intel芯片,所以你需要关注Intel语法。