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

kev*_*vin 4 x86 assembly

我即将在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$** 
Run Code Online (Sandbox Code Playgroud)

而来源是

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

swap:
        pushl   %ebp
        movl    %esp, %ebp

        movl    %ebp, %esp
        popl    %ebp
        ret
Run Code Online (Sandbox Code Playgroud)

我搜索了一些解决方案,这是我必须把 - 比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$** 
Run Code Online (Sandbox Code Playgroud)

你能救我吗?只是让我知道编译汇编文件需要什么.我已经有了XCode,我宁愿用commend window和vi编辑器来做这件事.

Pas*_*uoq 6

您的代码是32位程序集.Snow Leopard上的编译默认为64位,但您可以gcc -m32用于编译32位代码.当然还有一些选项可以传递给我as,ld但我发现只记住选项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;
}
Run Code Online (Sandbox Code Playgroud)

在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
Run Code Online (Sandbox Code Playgroud)

您可以使用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
Run Code Online (Sandbox Code Playgroud)

在Snow Leopard上你将获得64位汇编(amd64).您可以使用-m64 gcc选项在Leopard上获得相同的功能,并且您可以使用-m32选项在Leopard上运行gcc时使用Snow Leopard.