2011-12-06 13 views
8

Tengo una pieza corta de ensamblaje (x86) que estoy tratando de descubrir qué hace.En el ensamblaje x86, ¿cómo se puede establecer el indicador de cero (ZF) sin realizar una operación de comparación?

... 
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 
.... 

Parece que su bucle aunque hasta que el "JNE" se evalúa como falsa, es decir, la bandera cero = 0. (posiblemente su puesta los números 1, 2, 3 ... en la pila ??)

De mi breve investigación sobre el ensamblaje (estoy de nuevo en esto), seam establece el indicador de cero haciendo una operación de comparación (CMP), pero no veo una operación de comparación.

Entonces, ¿bajo qué condiciones saldrá de este circuito?

Respuesta

11

inc establece ZF si el valor de cl después del incremento es cero. El bucle está haciendo esto:

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; 

El bucle termina cuando cl se incrementa de 255 y se enrolla alrededor de 0, el establecimiento de ZF.

+0

Ok, esto tiene sentido. ¡Gracias! – Robert

+0

Creo que seguí todo eso excepto 'mov% cl, (% esp,% ecx, 1)'. En inglés diría "mueva los 8 bits inferiores de CX (CL) a la RAM en la dirección en ESP + ECX", lo cual tiene sentido, pero ¿cuál es el operando '1'? ¿Es esto realmente 'array [cl + 1] = cl' (stack overflow?) O quizás' array [cl] = cl + 1'? Probablemente me faltan algunos matices de ensamblaje x86, pero tengo curiosidad. – mpontillo

+3

El 1 es realmente un tamaño por el cual escalar el desplazamiento. Entonces es realmente una matriz [cl * 1] = cl. –

2

operaciones matemáticas como inc y dec también pueden establecer el indicador de cero.

7

Instrucciones aritméticas como add, sub, inc, dec, sar, sal, pero también operaciones en modo bit como test, shl, shr, or, and, xor, neg y así sucesivamente, modifique la ZF.

+0

Gracias por la lista completa, será útil. ¿Lo obtuviste de una referencia particular o lo sabías de mano? – Robert

+0

Conocía estas instrucciones, pero tenía que buscar los efectos específicos en los manuales de Intel/google. No sé de una lista de instrucciones que afectan a ZF. – newgre

1

O, para empezar, guarde [presione] las banderas en la pila, [pop] obtenga la pila en el registro, use arithmatic u operador con el bit deseado en el registro, presione el registro y haga clic en la bandera.

algo como esto.

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 
Cuestiones relacionadas