2011-12-06 14 views
8

Ho un breve pezzo di (x86) assemblaggio che sto cercando di capire cosa fa.Nell'assemblaggio x86, come è possibile impostare il flag di zero (ZF) senza eseguire un'operazione di confronto?

... 
6:  81 ec 00 01 00 00  sub $0x100, %esp 
c:  31 c9     xor %ecx , %ecx 
e:  88 0c 0c    mov %cl , (%esp, %ecx, 1) 
11:  fe c1     inc %cl 
13:  75 f9     jne 0xe 
.... 

Sembra suo loop se fino alla "JNE" restituisce false, cioè il flag zero = 0. (possibilmente sua messa i numeri 1, 2, 3 ... nella pila ??)

Dalla mia breve indagine sull'assemblaggio (im nuovo a questo) è necessario impostare il flag di zero eseguendo un'operazione di confronto (CMP), ma non vedo un'operazione di confronto.

Quindi, in quali condizioni uscirà da questo ciclo?

risposta

11

imposta ZF se il valore di cl dopo l'incremento è zero. Il ciclo sta facendo questo:

sub $0x100, %esp   // unsigned char array[256]; 
xor %ecx , %ecx   // unsigned char cl = 0; 
mov %cl , (%esp, %ecx, 1) // e: array[cl] = cl; 
inc %cl      // cl += 1; 
jne 0xe      // if (cl != 0) goto e; 

Il ciclo termina quando cl viene incrementato da 255 e avvolge intorno a 0, l'impostazione ZF.

+0

Ok, questo ha senso. Grazie! – Robert

+0

Penso di aver seguito tutto ciò tranne per "mov% cl, (% esp,% ecx, 1)". In inglese direi "sposta gli 8 bit più bassi di CX (CL) nella RAM all'indirizzo ESP + ECX", che ha senso, ma quale è l'operando '1'? Questo è veramente 'array [cl + 1] = cl' (stack overflow?) O forse' array [cl] = cl + 1'? Probabilmente mi manca qualche sfumatura dell'assemblaggio x86, ma sono curioso. – mpontillo

+3

L'1 è in realtà una dimensione con cui ridimensionare l'offset. Quindi il suo vero array [cl * 1] = cl. –

2

le operazioni matematiche come inc e dec possono anche impostare l'indicatore di zero.

7

Istruzioni aritmetiche come add, sub, inc, dec, sar, sal, ma anche operazioni bit a bit come test, shl, shr, or, and, xor, neg e così via, modificare ZF.

+0

Grazie per l'elenco completo, sarà utile. Hai preso questo da un riferimento particolare o lo sapevi fuori mano? – Robert

+0

Conoscevo queste istruzioni, ma dovevo cercare gli effetti specifici nei manuali di Intel/Google. Non conosco un elenco di istruzioni che riguardano la ZF. – newgre

1

Oppure, per cominciare, salvare [push] i flag in pila, [pop] ottenere la pila in registrazione, utilizzare aritmetica o operatore con il bit desiderato sul registro, premere il registro e inserire la bandiera.

qualcosa come questo.

pushf 
pop ax 
or ax, 0x100 [this will set trap flag, you can get the value for any flag or flags you want] 
push ax 
popf 
Problemi correlati