2016-03-31 10 views
2

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?

Antwort

4

Sie scheinen alles richtig gemacht zu haben, außer dass Sie MCVE nicht zur Verfügung gestellt haben und gdb log nicht angezeigt haben. Du hast Recht, dass ZF NICHT gesetzt sein sollte. Vielleicht hast du gdb falsch benutzt.

6   mov dword [rbp-0xc], -24 
(gdb) s 
7   mov eax, 1000 
(gdb) 
8   cmp eax, dword [rbp-0xc] 
(gdb) 
9   jle foo 
(gdb) p/d $eax 
$1 = 1000 
(gdb) x/wd $rbp-0xc 
0x7fffffffe254: -24 
(gdb) p $eflags 
$2 = [ CF PF IF ] 

der Tat wird der Sprung nicht genommen werden.

Da Sie darauf bestehen, dass ZF gesetzt ist, bedeutet das wahrscheinlich, dass x/d eine Byte-Größe anstelle des richtigen dwords verwendet. Wenn Sie 1000 im Speicher haben, sieht das wie e8 03 00 00 aus, da x86 Little Endian ist. Wenn Sie nur das niedrigste Byte als signiert drucken, wird es als -24 ausgegeben. Verwenden Sie x/wd, um die dword-Größe zu erzwingen, andernfalls verwendet gdb standardmäßig die zuletzt verwendete Größe, die möglicherweise nicht angemessen ist.

+0

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

+0

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

+0

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