Я изучаю сборку x86 на OS X 10.6, как мне скомпилировать? - PullRequest
4 голосов
/ 02 мая 2010

Я собираюсь изучать язык ассемблера x86 на Mac OS X. Я использую в качестве инструкции для компиляции сборочного файла в окне комманд. Но у меня есть несколько ошибок, и я не знаю, как мне пройти.

Вот ошибки и мой код сборки, который довольно прост.

**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 и редактором vi.

Ответы [ 4 ]

6 голосов
/ 02 мая 2010

Ваш код 32-битная сборка. Компиляция на Snow Leopard по умолчанию 64-битная, но вы можете использовать gcc -m32 для компиляции 32-битного кода. Конечно, есть также опции, которые вы можете передать as и ld, но я обнаружил, что запоминания только опции для gcc было достаточно, так как это интерфейс для всех этих вещей.

Используйте gcc, чтобы показать пример кода сборки, который работает: введите минимальную функцию C в файле test.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). Вы можете получить то же самое на Leopard, используя опцию -m64 gcc, а на Snow Leopard вы можете получить то же самое, что и запустить gcc на Leopard с опцией -m32.

2 голосов
/ 02 мая 2010

Apple as разветвляется из binutils 1.38, в то время как текущая версия - 2.20, поэтому может быть недоступно много новых директив. Я не могу найти руководство для 1.38, но самый старый (2.10), который я смог найти , утверждает, что .type связан только с выводом формата COFF. Формат объектов на Mac - Mach-O, поэтому директива .type не имеет смысла. Просто удали его.

2 голосов
/ 02 мая 2010

Используйте GCC , он скомпилирует и свяжет для вас: cc swap.s

0 голосов
/ 23 июля 2013

Недавно я тоже столкнулся с этой проблемой, пытаясь скомпилировать Intel x86 на Mac OS X:

Для носа:

-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

One-вкладыш:

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...