Assembler scanf Erklärung?

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

RedDevil1982 
Fragesteller
 02.05.2023, 22:25

Gibts des auch für Assembler x86 in Zsh. mit scanf?

0
Kelec  02.05.2023, 22:27
@RedDevil1982

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.

0
RedDevil1982 
Fragesteller
 02.05.2023, 22:27

Was steht in diesem section data:

formatin: db "%d", 0 ?????

integer: times 4 db 0 ?????

0
Kelec  02.05.2023, 22:50
@RedDevil1982

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.

0
RedDevil1982 
Fragesteller
 02.05.2023, 22:58
@Kelec

" %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

0
KarlRanseierIII  02.05.2023, 23:07
@RedDevil1982

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)
1
RedDevil1982 
Fragesteller
 02.05.2023, 23:39
@KarlRanseierIII

formatin: db "%d" ,0 Was soll die 0 hinten dran, ich finde dazu nichts in der Dokumentation

0
KarlRanseierIII  02.05.2023, 23:47
@RedDevil1982

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.

0
RedDevil1982 
Fragesteller
 02.05.2023, 22:28

Wir arbeiten mit X86

0
Kelec  02.05.2023, 22:54
@RedDevil1982

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.

0
RedDevil1982 
Fragesteller
 02.05.2023, 22:31

Ich habe gedacht über scanf kann man etwas einlesen?

0
Kelec  02.05.2023, 22:54
@RedDevil1982

Ja das wird ja auch gemacht. scanf liest eine Zahl ein und speichert diese dann in der Variable integer.

0
RedDevil1982 
Fragesteller
 02.05.2023, 23:02
@Kelec

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?

0
Kelec  02.05.2023, 23:09
@RedDevil1982

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.

0
RedDevil1982 
Fragesteller
 04.05.2023, 15:33

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

0
Kelec  04.05.2023, 21:48
@RedDevil1982

Printf hat mindestens 2 Argumente das erste ist ein String und dieser fehlt dir hier.

Ich verweise hierbei an die Doku von printf.

0