129 Stimmen

`testl` eax gegen eax?

Ich versuche zu verstehen, etwas Assembly.

Der Assembly-Code lautet wie folgt, ich interessiere mich für die testl Zeile:

000319df  8b4508        movl   0x08(%ebp), %eax  
000319e2  8b4004        movl   0x04(%eax), %eax  
000319e5  85c0          testl  %eax, %eax  
000319e7  7407          je     0x000319f0  

Ich versuche zu verstehen, was der Punkt des testl zwischen %eax und %eax ist? Ich denke, die Details dieses Codes sind nicht wichtig, ich versuche nur zu verstehen, ob der Test mit sich selbst nicht immer wahr wäre?

3voto

Mike Thompson Punkte 6510

Wenn eax Null ist, wird der bedingte Sprung ausgeführt, ansonsten wird die Ausführung bei 319e9 fortgesetzt

0voto

user7259278 Punkte 1

In einigen Programmen können sie zur Überprüfung eines Pufferüberlaufs verwendet werden. Ganz oben im zugewiesenen Speicher wird eine 0 platziert. Nachdem Daten in den Stack eingegeben wurden, wird nach der 0 am Anfang des zugewiesenen Speichers gesucht, um sicherzustellen, dass der zugewiesene Speicher nicht überlaufen ist.

Es wurde im Stack0-Übungsteil der exploits-exercises verwendet, um zu überprüfen, ob ein Überlauf vorlag, und wenn nicht und dort eine Null stand, würde es "Versuch es erneut" anzeigen

0x080483f4 :    push   ebp
0x080483f5 :    mov    ebp,esp
0x080483f7 :    and    esp,0xfffffff0
0x080483fa :    sub    esp,0x60                     
0x080483fd :    mov    DWORD PTR [esp+0x5c],0x0 ;setzt eine Null auf den Stack
0x08048405 :   lea    eax,[esp+0x1c]
0x08048409 :   mov    DWORD PTR [esp],eax
0x0804840c :   call   0x804830c 
0x08048411 :   mov    eax,DWORD PTR [esp+0x5c] 
0x08048415 :   test   eax,eax                  ; überprüft ob es null ist
0x08048417 :   je     0x8048427 
0x08048419 :   mov    DWORD PTR [esp],0x8048500 
0x08048420 :   call   0x804832c 
0x08048425 :   jmp    0x8048433 
0x08048427 :   mov    DWORD PTR [esp],0x8048529
0x0804842e :   call   0x804832c 
0x08048433 :   leave
0x08048434 :   ret

0 Stimmen

Ich sehe nicht, was dieser spezielle Fall des Überprüfens eines Registers auf Nichtnull zu diesem Fragen- und Antwortspiel beiträgt. Besonders wenn cmp DWORD PTR [esp+0x5c], 0 / jz 0x8048427 effizienter gewesen wäre als ein separater MOV-Load und dann TEST. Dies ist kaum ein üblicher Anwendungsfall für die Überprüfung auf Null.

-4voto

cbei_you Punkte 1

Wir könnten den jg**jle sehen Wenn testl %edx,%edx. jle .L3 könnten wir leicht feststellen, dass jle** geeignet ist (SF^OF)|ZF, wenn %edx Null ist, ist ZF=1, aber wenn %edx nicht Null ist und -1 ist, nach dem testl, ist OF=0 und SF=1, also ist das Flag true, das den Sprung implementiert. Entschuldigung, mein Englisch ist schlecht

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X