Ausgabevariablenwerte in x86 ASM
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.
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.