| FAQ der Newsgroup de.comp.lang.assembler (d.c.l.a.) | |
|
Wie gebe ich auf einem Standard-PC etwas auf dem Bildschirm aus? Das kommt ganz darauf an, unter welchem Betriebssystem das Programm läuft. Ist es ein DOS-Programm (egal ob .com oder .exe) benutzt man gewöhnlich Funktion 9 von Interrupt 21h, wobei sich in ds:dx die Adresse der auszugebenden Zeichen befindet. Die Zeichenkette muß mit dem Dollarzeichen $ enden. Einzelne Zeichen kann man am einfachsten mit Funktion 2 von Interrupt 21h ausgeben, wobei sich das Zeichen im Register DL befinden muß. Im Textmodus kann man auch direkt in den Bildschirmspeicher schreiben. Dieser beginnt in der Regel bei Adresse B800:0000 (80x25 mit 16 Farben). Jedes Zeichen nimmt 2 Bytes in Anspruch: das Zeichen selbst gefolgt von einem Attributbyte, das die Vorder- und Hintergrundfarbe für dieses Zeichen angibt. Für Konsolen-Programme unter Windows kann man die API-Funktion WriteConsoleA verwenden. Alternativ steht die Funktion MessageBoxA zur Verfügung, die auch unter graphischen Oberflächen benutzt werden kann, aber den Benutzer um Bestätigung bittet. Text der ursprünglichen FAQ von de.comp.lang.assembler.x86 Juli 2005 Benutzt man Linux, so kann man mit write() auf die Konsole schreiben. Dies kann zum einen über die libc stattfinden (man pushe alle Parameter in umgekehrter Reihenfolge auf den Stack, rufe write() auf und lösche die Parameter danach vom Stack wieder) oder aber über das syscall-Interface: In /usr/include/asm/unistd_32.h (oder /usr/include/asm/unistd_64.h, je nach Betriebssystem) stehen die Nummern der syscalls drin. Hier ist das 4 für write. Dann muss man einfach nur die Parameter wie folgt positionieren:
eax: Syscall-Nummer
ebx: 1. Parameter (hier: Dateideskriptor, also 1 für normale Meldungen
und 2 für Fehlermeldungen)
ecx: 2. Parameter (hier: Zeiger auf den auszugebenden String)
edx: 3. Parameter (hier: Länge des Strings)
Anschließend ist "int 80h" aufzurufen.
Markus Wichmann Aug 2008 in d.c.l.a. <ai1mo5-rs3.ln1@www.wichi.de.vu> |