Frage

Ich schreibe ein Programm in der Montage und es funktioniert nicht. Ich möchte Variablen in x86 -Funktionen ausgeben, um sicherzustellen, dass die Werte das sind, was ich von ihnen erwarte. Gibt es eine einfache Möglichkeit, dies zu tun, oder ist es sehr komplex?

Wenn es einfacher wird, werden die Montagefunktionen aus C -Funktionen verwendet und mit GCC zusammengestellt.

War es hilfreich?

Lösung

Es scheint, dass Ihre Frage in den Zeilen von "Wie kann ich Variablenwerte in x86 Assembler ausdrucken" liegen. Der X86 selbst weiß nicht, wie das geht, da er vollständig davon abhängt, welches Ausgabegerät Sie verwenden (und welche Einzelheiten der OS-bereitgestellten Schnittstelle zu diesem Ausgabegerät).

Eine Möglichkeit, dies zu tun, besteht darin, das Betriebssystemsystemen zu verwenden, wie Sie selbst in einer anderen Antwort erwähnt haben. Wenn Sie unter x86 Linux sind, können Sie die verwenden sys_write SYS CALL, um eine Zeichenfolge in die Standardausgabe wie diese zu schreiben (GNU -Assembler -Syntax):

STR:
    .string "message from assembler\n"

.globl asmfunc
    .type asmfunc, @function

asmfunc:
    movl $4, %eax   # sys_write
    movl $1, %ebx   # stdout
    leal STR, %ecx  #
    movl $23, %edx  # length
    int $0x80       # syscall

    ret

Wenn Sie jedoch numerische Werte ausdrucken möchten, besteht die flexiblere Methode darin, die zu verwenden printf() Funktionieren Sie aus der C -Standardbibliothek (Sie erwähnen, dass Sie Ihre Assembler -Rountinen von C anrufen, sodass Sie wahrscheinlich trotzdem mit der Standardbibliothek verknüpfen). Dies ist ein Beispiel:

int_format:
    .string "%d\n"

.globl asmfunc2
    .type asmfunc2, @function

asmfunc2:
    movl $123456, %eax

    # print content of %eax as decimal integer
    pusha           # save all registers
    pushl %eax
    pushl $int_format
    call printf
    add $8, %esp    # remove arguments from stack
    popa            # restore saved registers

    ret

Zwei Dinge zu beachten:

  • Sie müssen Register speichern und wiederherstellen, weil sie vom Anruf gepackt werden. und
  • Wenn Sie eine Funktion aufrufen, werden die Argumente in der richtigen Reihenfolge nach rechts gedrückt.
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top