我在OS X 10.6上学习x86汇编,我该如何编译?

时间:2010-05-02 05:49:05

标签: assembly x86

我即将在Mac OS X上学习x86汇编语言。 我正在使用指令在commend窗口中编译汇编文件。 但我有几个错误,我不知道如何通过。

以下是错误和汇编代码,非常简单。

**ung-mi-lims-macbook-pro:pa2 ungmi$ as swap.s
swap.s:16:Unknown pseudo-op: .type
swap.s:16:Rest of line ignored. 1st junk character valued 115 (s).
swap.s:19:suffix or operands invalid for `push'
swap.s:46:suffix or operands invalid for `pop'
ung-mi-lims-macbook-pro:pa2 ungmi$** 

,来源是

.text
        .align 4
.globl  swap
        .type swap,@function

swap:
        pushl   %ebp
        movl    %esp, %ebp

        movl    %ebp, %esp
        popl    %ebp
        ret

我搜索了一些解决方案,我必须将-arch i386放在

之上
**ung-mi-lims-macbook-pro:pa2 ungmi$ as -arch i386 swap.s
swap.s:16:Unknown pseudo-op: .type
swap.s:16:Rest of line ignored. 1st junk character valued 115 (s).
ung-mi-lims-macbook-pro:pa2 ungmi$** 
你可以帮帮我吗?只是让我知道编译汇编文件需要什么。 我已经有了XCode,我宁愿用commend window和vi editor来做这个。

4 个答案:

答案 0 :(得分:6)

您的代码是32位程序集。 Snow Leopard上的编译默认为64位,但您可以使用gcc -m32来编译32位代码。当然还有一些选项可以传递给asld,但我发现仅记住gcc的选项就足够了,因为它是所有这些事情的前端

使用gcc向您展示一个有效的汇编代码示例:在文件test.c中键入一个最小C函数,并使用gcc -S test.c在文件test.s中生成汇编。

示例:

int x;

void f(void)
{
  int i;
  for (i = 0; i < 5; i++)  x = x + 1;
}

在Leopard Mac上汇编编译:

    .text
.globl _f
_f:
    pushl   %ebp
    movl    %esp, %ebp
    subl    $24, %esp
    call    L6
"L00000000001$pb":
L6:
    popl    %ecx
    movl    $0, -12(%ebp)
    jmp L2
L3:
    leal    L_x$non_lazy_ptr-"L00000000001$pb"(%ecx), %eax
    movl    (%eax), %eax
    movl    (%eax), %eax
    leal    1(%eax), %edx
    leal    L_x$non_lazy_ptr-"L00000000001$pb"(%ecx), %eax
    movl    (%eax), %eax
    movl    %edx, (%eax)
    leal    -12(%ebp), %eax
    incl    (%eax)
L2:
    cmpl    $4, -12(%ebp)
    jle L3
    leave
    ret
.comm _x,4,2
    .section __IMPORT,__pointers,non_lazy_symbol_pointers
L_x$non_lazy_ptr:
    .indirect_symbol _x
    .long   0
    .subsections_via_symbols

您可以使用gcc选项-fno-PIC:

使其更简单
    .text
.globl _f
_f:
    pushl   %ebp
    movl    %esp, %ebp
    subl    $24, %esp
    movl    $0, -12(%ebp)
    jmp L2
L3:
    movl    _x, %eax
    incl    %eax
    movl    %eax, _x
    leal    -12(%ebp), %eax
    incl    (%eax)
L2:
    cmpl    $4, -12(%ebp)
    jle L3
    leave
    ret
.comm _x,4,2
    .subsections_via_symbols

在Snow Leopard上,您将获得64位程序集(amd64)。你可以使用-m64 gcc选项在Leopard上获得同样的东西,你可以在Snow Leopard上使用-m32选项在Leopard上运行gcc。

答案 1 :(得分:2)

使用GCC,它会为您编译和链接:cc swap.s

答案 2 :(得分:2)

Apple的as是从binutils 1.38分叉的,而当前的版本是2.20,因此可能有许多新的指令不可用。我找不到1.38的手册,但oldest one (2.10) I could find表示.type只与COFF格式输出相关联。 Mac上的对象格式是Mach-O,因此.type指令毫无意义。只需删除它。

答案 3 :(得分: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

对于Shell:

./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