Bedeutung von 0x8($rsp)
Mein erstes mal lernen Assembly Lang. Hier ist ein Teil (gdb) Demontage:
mov $0x131,%eax
cmp 0x8(%rsp),%eax //Question here, what is the value of 0x8(%rsp)?
(gdb)i r
rax 0x131 305
rbx 0x7fffffffe578 140737488348536
rcx 0x20 32
rdx 0x7fffffffe478 140737488348280
rsi 0x0 0
rdi 0x1999999999999999 1844674407370955161
rbp 0x0 0x0
rsp 0x7fffffffe470 0x7fffffffe470
r8 0x37ed3bb080 240203313280
r9 0x0 0
r10 0x1e 30
r11 0x0 0
r12 0x400cb0 4197552
r13 0x7fffffffe570 140737488348528
r14 0x0 0
r15 0x0 0
rip 0x400fd9 0x400fd9 <phase_3+129>
eflags 0x212 [ AF IF ]
cs 0x33 51
ss 0x2b 43
ds 0x0 0
es 0x0 0
fs 0x0 0
Ich habe Schwierigkeiten, herauszufinden, was es tut, zu vergleichen. und was ist der Wert von 0x8(%rsp)
.
(Ich weiß, diese Frage klingt dumm)
Vielen Dank im Voraus
=-==========
Schließlich habe ich gelöst, indem
(gdb) p /x *(int *)($rsp+0x8)
mit Hilfe von diesem post Wie print -0x4(%rbp) in gdb?
Zack, die Antwort sollte richtig sein, aber es funktioniert nicht da ich ein 64 bit OS.
InformationsquelleAutor Shiji.J | 2013-11-02
Du musst angemeldet sein, um einen Kommentar abzugeben.
Klammern bedeuten in der Regel zu dereferenzieren. 0x8(%rsp) bedeutet "erhalten, die Lage auf dem Stapel, den 8 bytes, die Weg von der stack-pointer %rsp, und nehmen Sie dann den Wert an dieser Adresse."
Es bewegt sich 0x131 in %eax, und dann vergleicht Sie mit den Daten an diesem Speicherort. cmp setzt die
eflags
registrieren, abhängig von diesem Vergleich (wie das Zero-Flag, wenn die Operanden gleich waren, etc.)Um zu sehen, was ist unter der Adresse mithilfe von GDB, Typ
Dieser Befehl 'x' prüft den Speicher.
1 bedeutet prüfen, 1 von welcher Einheit angegeben ist.
"d" bedeutet, dass die Ausgabe in dezimaler Schreibweise (im Gegensatz zur hex). Ich weiß nicht, welche Art von Daten Sie einen Vergleich zu, so dass Sie möglicherweise verwenden Sie "c" um einen char oder ein "x", um eine hex, oder "s" für einen string, oder was auch immer.
"w" bietet das Gerät, in diesem Fall ein Wort, das 4 bytes.
Damit dieser Befehl sieht im 4 bytes an die angegebene Adresse 0x8(%rsp), und druckt was auch immer im Dezimalformat.
Erfahren Sie mehr über die Verwendung von GDB zu sehen, wie Sie Ihr Gedächtnis verändert, siehe diesem Dokument.
Für mein 64bit OS (gdb) p /x *(int *)($rsp+0x8) funktioniert bei mir. x/1dw 0x8(%esp), führen zu einem syntax-Fehler in der 64bit OS. Jedenfalls, deine Antwort ist wirklich hilfreich, vielen Dank.
InformationsquelleAutor Zach Stark
Weil das Programm zugewiesenen einige stack-Speicher, indem Sie den stack-pointer. Nun, wenn Sie wollen, verwenden Sie die zugewiesene stack-Speicher, die Sie benötigen, um einen offset zu dereferenzieren.
InformationsquelleAutor Yuxuan Chen