4 Stimmen

Ich lerne gerade x86-Assembler unter OS X 10.6, wie kompiliere ich?

Ich bin dabei, die x86-Assemblersprache unter Mac OS X zu lernen. Ich verwende die Anweisung zum Kompilieren einer Assemblerdatei im Commend-Fenster. Aber ich habe mehrere Fehler und ich weiß nicht, wie ich durchkommen kann.

Hier sind die Fehler und mein Assembler-Code, der recht einfach ist.

**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$** 

und die Quelle ist

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

swap:
        pushl   %ebp
        movl    %esp, %ebp

        movl    %ebp, %esp
        popl    %ebp
        ret

und ich habe nach einer Lösung gesucht, die darin besteht, dass ich -arch i386 eingeben muss als

**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$** 

Können Sie mir helfen? Lassen Sie mich einfach wissen, was ich brauche, um Assembly-Datei zu kompilieren. Ich habe XCode bereits und ich würde lieber dies mit commend Fenster und vi-Editor zu tun.

6voto

Pascal Cuoq Punkte 77147

Ihr Code ist 32-Bit-Assembler. Die Kompilierung unter Snow Leopard ist standardmäßig 64-Bit, aber Sie können gcc -m32 für die Kompilierung von 32-Bit-Code. Natürlich gibt es auch Optionen, die Sie an as y ld aber ich habe festgestellt, dass das Erinnern nur an die Option für gcc genügte, da es ein Front-End für all diese Dinge ist.

Verwenden Sie gcc, um Ihnen ein Beispiel für funktionierenden Assembler-Code zu zeigen: Geben Sie eine minimale C-Funktion in die Datei test.c ein und verwenden Sie gcc -S test.c um die Baugruppe in der Datei test.s zu erstellen.

Beispiel:

int x;

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

wird auf diesem Leopard-Mac in Assembler kompiliert:

    .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

Sie können es einfacher machen, indem Sie die gcc-Option -fno-PIC verwenden:

    .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

Unter Snow Leopard erhalten Sie 64-Bit-Assembly (amd64). Sie können dasselbe unter Leopard erreichen, indem Sie die Option -m64 gcc verwenden, und Sie können unter Snow Leopard dasselbe erreichen, wenn Sie gcc unter Leopard mit der Option -m32 verwenden.

2voto

Nikolai Fetissov Punkte 79627

Utilisez GCC kompiliert und verlinkt es für Sie: cc swap.s

2voto

kennytm Punkte 488916

Apples as ist ein Fork von binutils 1.38, während die aktuelle Version 2.20 ist, so dass es viele neue Direktiven geben kann, die nicht verfügbar sind. Ich kann das Handbuch für 1.38 nicht finden, aber die die älteste (2.10), die ich finden konnte stellt fest, dass .type ist nur mit der Ausgabe im COFF-Format verbunden. Das Objektformat auf dem Mac ist Mach-O, so dass die .type Richtlinie ist sinnlos. Entfernen Sie sie einfach.

0voto

Jared Burrows Punkte 52572

Kürzlich bin ich auch auf dieses Problem gestoßen, als ich versuchte, Intel x86 unter Mac OS X zu kompilieren:

Für nasm:

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

Für 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

Für Shell:

./hello.o - execution

Einzeiler:

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

Lassen Sie mich wissen, ob das hilft!

Wie das geht, habe ich hier in meinem Blog beschrieben:

http://blog.burrowsapps.com/2013/07/how-to-compile-helloworld-in-intel-x86.html

Für eine ausführlichere Erklärung, erklärte ich auf meinem Github hier:

https://github.com/jaredsburrows/Assembly

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X