2017-12-25 21 views
0

Ich bemerke ein merkwürdiges Verhalten mit scanf im NASM Assembly Code. Ich habe zwei Anrufe scanf:x86 NASM ändert Wert bei Adresse, die nicht als Parameter übergeben wurde

mov rdi, fmt 
mov rsi, r14 
call _scanf 

und

mov rdi, fmt 
mov rsi, r15 
call _scanf 

wo fmt im data Abschnitt deklariert als:

section .data 
fmt: db "%d", 0 

Vor dem ersten scanf, die Adressen in R14 und R15 sind:

r14 = 0x0000000000002104 
r15 = 0x0000000000002105 

In LLDB, me read -fd -c1 auf eine dieser beiden Adressen Ausgänge ist zum Glück 0.

Nach der Eingabe von "2" zum ersten scanf, wird der Wert in 0x0000000000002104 Ausführung 2.

After "2" für die zweite Eingabe scanf ist der Wert in 0x0000000000002105 2. doch nun der Wert in 0x0000000000002104 ist 514.

ich nach Anruf zu scanf an anderen Orten ähnliche Änderungen im Speicher erlebe und werde sie reproduzieren, wenn nötig, aber wollte wissen, ob jemand habe das erlebt.

+2

Die Adressen 2104 und 2105 sind ein Byte voneinander entfernt, aber Sie verwenden "% d", das eine 4 Byte große Ganzzahl füllt und die Bytes nach dem Ort, an dem Sie versuchen, zu überlesen. Ihnen fehlt ein minimales vollständiges überprüfbares Beispiel. Sie sollten Ihren Code einfach posten und wir können ihn besser verstehen. Ist das auf MacOS? und hast du das _AL_ register vor dem scanf auf null gesetzt? –

+2

514 ist 0x0202, dh die DWORD-Kombination der Bytewerte in 2105 und 2104. – prl

+0

@MichaelPetch: Sie können '[mcve]' in Kommentaren verwenden: es wird zu [mcve] erweitert. Das ist fast zu wenig, aber ich denke, dass diese spezifische Frage darauf basiert. Ich denke, dass Sie überprüfen möchten, welche Breite das OP verwendet, um die ganzzahligen Werte nach scanf zu lesen, um sicherzustellen, dass es ein dword ist, passend zu der Breite von "int", die "% d" speichert? –

Antwort

3

Zuvor verwendete ich %d als das Format für scanf, das 4 Bytes liest. Die Adressen in r14 und r15 waren jedoch im Bereich bss für nur 1 Byte reserviert. Ich änderte das so, dass sie jetzt 4 Bytes reservieren und das Programm wie erwartet funktioniert.

Verwandte Themen