Ich lerne Assembler-Sprache und stieß auf ein Problem, das ich nicht einmal weiß, wie man Google fragt. Ich verwende Gdb, um einfaches c-Programm zu debuggen.Was ist der Befehl assembly cmp, der genau vergleicht?
habe ich folgenden Code:
cmp eax,DWORD PTR [rbp-0xc]
jle 0x400cc2
auf dem cmp Befehl brechen, ich bin Wert für den Vergleich Überprüfung:
p/d $eax // 1000
x/d $rbp-0xc //-24
Also gehe ich davon aus, dass der Sprung wird nicht passieren. Aber nachdem ich zum nächsten Schritt gegangen bin, kann ich sehen, dass die ZF-Flagge gesetzt ist. Könnte jemand bitte in einfachen Worten erklären?
Nun, ich bin verwirrt. Ich habe es ein paar Mal versucht, und es ist immer dasselbe. Vor cmp '$ eflags = [IF]', nach dem Befehl '$ eeflags = [PF ZF IF] ' – nibsa
Bearbeiten Sie Ihre Frage mit dem vollständigen gdb-Protokoll. Verwenden Sie auch 'x/wd', um sicherzustellen, dass Sie 4-Byte-Ganzzahlen drucken. Beachten Sie, dass 1000 "e8 03 00 00" und -24 "e8 ff ff ff" ist. Wenn Sie also nur ein einzelnes Byte drucken, erhalten Sie möglicherweise ein Ergebnis von -24, obwohl 1000 im Speicher ist. – Jester
Omg, 'x/wd $ rbp-0xc' druckt mich 1000. Jetzt macht alles Sinn. Ich bin mit gdb nicht so vertraut und es ist schwer, Google so genau zu fragen. Vielen Dank! – nibsa