在Mac上进行x86汇编

有谁知道任何好的工具(我正在寻找IDE)在Mac上编写程序集。 Xcode对我来说有点麻烦。

另外,在Intel Mac上,我可以使用通用x86 asm吗?或者是否有修改的指令集?有关后英特尔的任何信息。

另外:我知道在windows上,asm可以在由OS创建的模拟环境中运行,以让代码认为它在自己的专用计算机上运行。 OS X是否提供相同的东西?

0

9 答案

可用的功能取决于您的处理器。苹果公司使用与其他人相同的英特尔产品。所以是的,通用x86应该没问题(假设你不在PPC上:D)。

就工具而言,我认为你最好的选择是一个很好的文本编辑器,它可以“理解”程序集。

0
额外

忘记找到一个IDE在Mac上编写/运行/编译汇编程序。但是,记住mac是UNIX。请参阅 http://asm.sourceforge.net/articles/linasm.html 。一个体面的指导(尽管很短),通过Linux上的GCC运行汇编程序。你可以模仿这个。 Mac电脑使用英特尔芯片,因此您需要查看英特尔语法。

0
额外

另外,在Intel Mac上,我可以使用通用x86 asm吗?或者是否有修改的指令集?有关英特尔Mac组装后的任何信息都有帮助。

这是相同的指令集;这是相同的芯片。

0
额外

最近我想学习如何在Mac OS X上编译Intel x86:

对于nasm:

-o hello.tmp - outfile
-f macho - specify format
Linux - elf or elf64
Mac OSX - macho

对于ld:

-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:

https://github.com/jaredsburrows/Assembly

0
额外

要获得一个很好的分步x86特定于Mac的介绍,请参阅 http ://peter.michaux.ca/articles/assembly-hello-world-for-os-x 。我尝试过的其他链接有一些非Mac陷阱。

0
额外

After installing any version of Xcode targeting Intel-based Macs, you should be able to write assembly code. Xcode is a suite of tools, only one of which is the IDE, so you don't have to use it if you don't want to. (That said, if there are specific things you find clunky, please file a bug at Apple's bug reporter - every bug goes to engineering.) Furthermore, installing Xcode will install both the Netwide Assembler (NASM) and the GNU Assembler (GAS); that will let you use whatever assembly syntax you're most comfortable with.

You'll also want to take a look at the Compiler & Debugging Guides, because those document the calling conventions used for the various architectures that Mac OS X runs on, as well as how the binary format and the loader work. The IA-32 (x86-32) calling conventions in particular may be slightly different from what you're used to.

还有一点需要注意的是,Mac OS X上的系统调用接口与您在DOS / Windows,Linux或其他BSD风格上可能使用的接口不同。系统调用在Mac OS X上不被视为稳定的API;相反,你总是通过libSystem。这将确保您编写的代码可以从一个OS版本移植到另一个版本。

最后,请记住,Mac OS X可以运行各种各样的硬件 - 从32位Core Single到高端四核Xeon。通过在汇编中编码,你可能不会像你想象的那样优化;一台机器上的最佳配置可能在另一台机器上最佳。苹果会定期测量其编译器并使用“-Os”优化标记调整其输出,以在整个系列中体面,并且有大量的矢量/矩阵处理库可用于通过手动调整的CPU特定实现获得高性能。

去大会聚会很好玩。现在为了速度而组装速度并不适合心脏病。

0
额外
Archive.org版本(它被切碎之前的最新版本) web.archive.org/web/20090622125037/http://developer.apple.co‌ m /…
额外 作者 Zimm3r,
两个人高声赞助了他的风流,零人们确实修复了这个链接......如果苹果真的有旧的链接重定向到新的文章......我发现与SO链接的苹果文档的链接几乎总是死的......
额外 作者 ArtOfWarfare,
链接不再有效
额外 作者 Max MacLeod,

如前所述,不要使用系统调用。尽管你可以使用标准的C库调用,但是请注意,每个Apple的 IA32函数调用ABI

如果您没有对齐堆栈,那么当您调用任何库或框架时,程序将在 __ 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
0
额外
谁能告诉我为什么运行这个例子“nasm -f男性hello.asm && gcc -arch i386 -e _main -lSystem -o hello hello.o && ./hello”给出了“总线错误:10”输出?
额外 作者 Colin,
想通了:我认为有一个错误。 clib_prolog的结尾应该包含%1个字节以便填充参数,并且clib_epilog应该添加%1个字节。我编辑了答案来反映这一点。
额外 作者 Colin,
您的链接已死亡。你能更新吗?
额外 作者 th3v0id,

不要忘记,与Windows不同,所有基于Unix的系统都需要在Windows之前拥有目的地之前的源代码

在Windows上:

mov $ source,%destination

但在Mac上反其道而行。

0
额外
如果您正在阅读Mac上的一些反汇编代码,并且使用典型的在线x86 asm参考作为指导,那么了解这一点很有帮助。
额外 作者 Colin,

在Mac上运行汇编代码仅距离您3步。它可以使用XCODE完成,但更好的是使用NASM命令行工具。 为了我的安逸,我已经安装了Xcode,如果你已经安装好了Xcode。

但是,您也可以不使用XCode。

只需遵循:

  1. First Install NASM using Homebrew brew install nasm
  2. convert .asm file into Obj File using this command nasm -f macho64 myFile.asm
  3. Run Obj File to see OutPut using command 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
0
额外