Assembler scanf Erklärung?
Was macht dieser Code?
Kann man mit scanf etwas von der Konsole einlesen?
1 Antwort
Im wesentlichen macht dieser Code nichts anderes als der C Code:
int integer=0;
scanf(formatin,&integer)
Das extern scanf sagt im wesentlichen nur es gibt irgendwo eine Funktion mit dem Namen scanf.
das call scanf ruft diese Funktion dann am Ende auf.
Was die Funktion selbst betrifft:
https://www.tutorialspoint.com/c_standard_library/c_function_scanf.htm
Printf hat mindestens 2 Argumente das erste ist ein String und dieser fehlt dir hier.
Ich verweise hierbei an die Doku von printf.
Ich habe gedacht über scanf kann man etwas einlesen?
Ja das wird ja auch gemacht. scanf liest eine Zahl ein und speichert diese dann in der Variable integer.
D. h. in dem Progamm wird eine integer Variable mit 4 Byte die sich integer nennt, in einen String der formatin heißt eingelesen mittels scanf?
Nein.
formatin ist der Format string. Lies dir bitte die verlinkte Dokumentation durch.
Der Wert wird in einen Integer umgewandelt und dieser Wert dann eben in der Variable namens integer gespeichert.
X86 ist die Prozessorarchitektur. Der Prozessor selbst kennt natürlich die Befehle extern usw nicht, sondern das Anweisungen an den Assembler die er beim Build vorgang ausführen soll. Ob der Assembler das kann oder nicht hängt eben von diesem Programm ab. Die meisten Makro Assembler können das aber direkt. Allerdings muss man dem Linker am Ende mitteilen, dass er das Programm gegen die C Standard Library linken soll.
Was steht in diesem section data:
formatin: db "%d", 0 ?????
integer: times 4 db 0 ?????
Das sind im wesentlichen Linker anweisungen. Die geben an wie das Memory Layout der Anwendung aussehen soll.
%d ist nichts anderes als eine String konstante in welcher eben der String %d steht.
integer: times 4db 0 bedeutet einfach nur deine Variable integer ist 4 byte lang.
" %d" d. h. in dem String steht ein ganze Zahl %d
Was soll diese , 0 hinten dran. Also formatin: db "%d", 0 ?
integer: times 4 db 0 ich habe einen integer klar für die lege ich 4 db ist 4 byte an. Ok!
Auch hier, was soll die 0 hintendran? integer: times 4 db 0
Das erste ist ein Format-String wie in die C-Funktion scanf() erwartet - was dieser bedeutet, siehe verlinkte Dokumentation.
Der integer ist genau das, ein Ort für einen 32-Bit int, einfacher wäre:
integer: dd 0
Das C Äquivalent wäre allerdings eher:
int integer=0;
scanf(formatin,&integer)
formatin: db "%d" ,0 Was soll die 0 hinten dran, ich finde dazu nichts in der Dokumentation
Wie bereits an anderer Stelle erklärt, werden in C Strings mit eienr 0 terminiert.
Im Übrigen wird bei der Dokumentation einer Funktion vorausgesetzt, daß die Grundlagen bekannt sind.
So ganz blick ich da net durch. Trotzdem Danke!
Gibts des auch für Assembler x86 in Zsh. mit scanf?
Was meinst du mit Zsh?
Ob dein jeweiliger Assembler das unterstützt oder nicht müsstest du nachsehen, aber sofern dieser am Ende solche Makros unterstützt um Funktionen aus der Standard Library zu laden geht das schon.
Wie gebe ich in Assembly, wenn ich wie oben beschrieben im Code, eine ganze Zahl in der Variablen integer gespeichert habe, diese wieder aus mittels printf?
in der main:
push integer
push formatin
call scanf
(Nun werden über Tastatur eingeben z. B. 567 Stack ist ja jetzt leer)
push integer
call printf
Nun müsste 567 auf der Konsole ausgegeben werden