2016-03-24 16 views
-1

Ich bin fast sicher ebp+0x8 zeigt auf eine Zeichenfolge (das Programm fragt tatsächlich durch eine Eingabeaufforderung dafür, aber ich bin nicht sicher, wo es gespeichert ist). Was ist die allgemeine Idee der Linien? Warum 1 zum 32-Bit-Teil von ebp + 8 hinzufügen?Was bedeuten diese Anweisungen? (Disassembly)

mov eax,DWORD PTR [ebp+0x8] 
movzx eax,BYTE PTR [eax] 
mov BYTE PTR [ebp-0x11],al 
add DWORD PTR [ebp+0x8],0x1 
mov eax,DWORD PTR [ebp+0x8] 
movzx eax,BYTE PTR [eax] 
test al,al 
+5

Es ist offenbar testen, ob die Zeichenfolge nur ein einzelnes Zeichen, und kopiert das erste Zeichen 'EBP-0x11'. Die '+ 1' ist Teil der Bedingung 'if (string [1] == 0) ', die die abschließende Null prüft. – Jester

+1

Das ist ernsthaft CodeDead. Es ist ein Debug/nicht optimierter Build, oder? Es ist komisch für dich, das zu haben, aber nicht die Quelle. Vernünftiger Code würde 'mov edx, [ebp + 8]'/'movzx eax, Byte ptr [edx + 1]'/'test al, al'. (Das Kopieren des ersten Bytes in ein lokales Array bei '[ebp-0x11]' habe ich weggelassen, da dieses nicht verwendet wird. Wenn die Kopie nicht benötigt wird, sogar 'cmp byte ptr [edx + 1], 0' Für Code-Größe würde die Verwendung von "movsb" oder "lodsb" funktionieren. –

Antwort

2

EBP Register ist für Ihre Funktionen Variablen verwenden.

ich denke EBP + 0x8 ist Ihr erstes Funktionsargument. und add DWORD PTR [ebp+0x8],0x1 ist etwas, was wie folgt aus:

proc01(char *c01){ 
'''' 
c01++;//add DWORD PTR [ebp+0x8],0x1 
... 
} 
+0

Als eine Nebenbemerkung zu "NOT EBP" wird EBP manchmal auch als Allzweckregister verwendet, insbesondere im Fall der FPO-Optimierung. – Neitsa

+0

Du hast Recht Ich werde meine Antwort bearbeiten – Amir

+1

@Amir Bitte korrigieren Sie die syntaktischen Fehler in Ihrer Antwort! –