简单的asm程序与MacOS Mountain Lion中的yasm

时间:2012-10-22 18:10:17

标签: macos gcc assembly yasm

我想用64位编译并执行一个非常简单的程序。

section .text 
global _start 
_start: 
   mov     rdx,len 
   mov     rcx,msg 
   mov     rbx,1 
   mov     rax,4 
   int     0x80 
   mov    rbx,0 
   mov     rax,1 
   int     0x80 
section .data 
msg     db      "Hello, world!",0xa 
len     equ     $ - msg 

编译它的行:

yasm -f elf64 -g dwarf2 example.asm

$ yasm --version
yasm 1.2.0

还尝试了另一种格式macho[|32|64], elf[|32] bin,但没有一种格式成功。

链接它的行:

gcc -o example example.o

ld: warning: ignoring file example.o, file was built for unsupported file format ( 0x7f 0x45 0x4c 0x46 0x 2 0x 1 0x 1 0x 0 0x 0 0x 0 0x 0 0x 0 0x 0 0x 0 0x 0 0x 0 ) which is not the architecture being linked (x86_64): example.o
Undefined symbols for architecture x86_64:
"_main", referenced from:
  start in crt1.10.6.o
ld: symbol(s) not found for architecture x86_64
collect2: ld returned 1 exit status

$ gcc --version
i686-apple-darwin11-llvm-gcc-4.2 (GCC) 4.2.1 (Based on Apple Inc. build 5658) (LLVM build 2336.11.00)

还尝试了gcc的一些选项,例如-m64 -arch x86_64

2 个答案:

答案 0 :(得分:8)

我一直在使用yasm处理OS X的汇编语言。装配线是:

yasm -f macho64 -l file.lst file.asm

然后与ld

相关联
ld -o file file.o

您应该在OS X上使用start而不是_start

之后使用gdb时出现问题。 OS X似乎没有任何可用的调试格式。

您可能有兴趣尝试我的名为ebe的IDE。我设法让断点和调试工作得相当好。目前我在调试浮点代码时遇到了一些问题。 gdb似乎并不知道ymm寄存器,并且gdb的默认版本后面有xmm寄存器的部分。

你可能喜欢ebe。使用

从sourceforge下载
git clone git://git.code.sf.net/p/ebe-ide/code ebe

它需要xterm,python,tkinter和pmw(一个python库)。

答案 1 :(得分:4)

这里有一些问题:

1)OS X不支持ELF,只支持Mach-O。

2)您的链接器正在寻找x86_64架构Mach-O而没有找到它。

ld: warning: ignoring file example.o, file was built for unsupported file format ( 0x7f 0x45 0x4c 0x46 0x 2 0x 1 0x 1 0x 0 0x 0 0x 0 0x 0 0x 0 0x 0 0x 0 0x 0 0x 0 ) which is not the architecture being linked (x86_64): example.o

确保您正在为x86_64进行汇编,或者尝试将-m32传递给GCC以使用x86。

3)您的链接器正在尝试包含C运行时库crt1.10.6.o,由于您没有定义_main函数,因此它看起来不像您想要的那样。也许您应该直接调用链接器而不是通过GCC调用它,或者找到正确的标志组合以传递给链接器以避免这种情况。

如果我是你,我会从以下步骤开始:

a)在C中编写hello world,让clang输出一个汇编文件(-s),然后查看是否可以使用clang汇编和链接它。这应该非常简单。

b)一旦有效,请使用fileotool确定您的目标文件应该是什么样子,并尝试使用yasm生成该文件。