online emulator disassembler compiler code assembler x86 assembly machine-code

disassembler - x86 assembly emulator



En el ensamblaje x86, ¿cómo se puede configurar el indicador de cero(ZF) sin realizar una operación de comparación? (4)

Tengo una pieza corta de ensamblaje (x86) que estoy tratando de descubrir qué hace.

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

Sin embargo, parece que es un bucle hasta que el "JNE" lo evalúa como falso, es decir, el indicador de cero = 0. (¿posiblemente está poniendo los números 1, 2, 3 ... en la pila?)

Desde mi breve investigación sobre el ensamblaje (estoy de nuevo en esto), estableces que estableces 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?


Las instrucciones aritméticas como add, sub, inc, dec, sar, sal , pero también las operaciones bit a bit como test, shl, shr, or, and, xor, neg y demás, modifican la ZF.


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


inc establece ZF si el valor de cl después del incremento es cero. Tu ciclo 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 ciclo finaliza cuando cl se incrementa desde 255 y se ajusta a 0, configurando ZF.


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