Como saber si un numero alojado en un registro (ej eax) es par:
Simplemente :
and eax,1
jnz Par
Si eax es 0 es par.
Sencillo pero modifica a eax , solo en el caso de que necesitemos a eax con el valor
original podemos usar este código que no lo modifica:
test eax,1
je Par ;Si Salta es par
Pero un código aun mejor es este: *Por Orniaco (Honor a quien honor merece)
Ventajas : Se usa la instrucción bt la cual tiene un consumo nulo
de los siclos del CPU de los 808x (Eso dicen en los opcode) y no modifica a EAX
bt eax, 0
jnb Espar ; Salta a donde trabajaremos si es par
---------------------------------------------------------------------------------------
----------------------------------------------------------------Consumos de CPU y Bytes
---------------------------------------------------------------------------------------
Ciclos Tamaño
Operands 808x 286 386 486 Bytes
reg,immed 4 3 2 1 3-4 <<<<<<<<< El consumo de And
reg,immed 5 3 2 1 3-4 <<<<<<< El consumo de Test
reg16,immed8 - - 3 3 4-8 <<<<<<<<<< El consumo de Bt
Consumo exacto de Bytes:
83E0 01 and eax, 1 <<<<<<<< El consumo de And eax,1 (3 bytes)
A9 01000000 test eax, 1 <<<<<<<< El consumo de Test eax,1 (5 bytes)
0FBAE0 00 bt eax, 0 <<<<<<<<<< El consumo de Bt eax,0 (4 bytes)
---------------------------------------------------------------------------------------
----------------------------------------------------------------Consumos de CPU y Bytes
---------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------
--------------------------------------------Mi (Humilde) Conclusión ; jajaja YST-H1N1
---------------------------------------------------------------------------------------
Si queremos saber si un numero es par sin modificar a eax usar (test eax,1) , si deseamos
cerar a eax en el caso que sea par podemos usar (and eax,1) ,
Pero:
Si estamos dentro de un ciclo repetitivo con X cantidad de operaciones y queremos saber
con rapidez si es par,lo mejor es usar (Bt eax,0) , ademas de no modificar a eax , para
una necesidad posterior.
No necesariamente tiene que estar en eax , puede ser en cualquier otro.
---------------------------------------------------------------------------------------
--------------------------------------------------------------------------Opcode usados
---------------------------------------------------------------------------------------
Uso: TEST destino,fuente
Modifica las banderas: CF OF PF SF ZF (AF undefined)
Performs a logical AND of the two operands updating the flags register without saving the result.
(Hace un And lógico con los dos operados , actualizando las Banderas sin salvar el resultado.)
Ciclos CPU Tamaño
Operands 808x 286 386 486 Bytes
reg,reg 3 2 1 1 2
reg,mem 9+EA 6 5 1 2-4 (W88=13+EA)
mem,reg 9+EA 6 5 2 2-4 (W88=13+EA)
reg,immed 5 3 2 1 3-4 <<<<<<<El consumo de Test eax,1
mem,immed 11+EA 6 5 2 3-6
accum,immed 4 3 2 1 2-3
--------------------------------------------------------------------------------------
Uso: BT destino,fuente (source)
Modifica las banderas: CF
The destination bit indexed by the source value is copied into the
Carry Flag.
(El bit de destino indexado por el valor de la fuente es copiado dentro del Carry Flag (Bandera de Acarreo))
Clocks Size
Operands 808x 286 386 486 Bytes
reg16,immed8 - - 3 3 4-8 <<<<<<<<<
mem16,immed8 - - 6 6 4-8
reg16,reg16 - - 3 3 3-7
mem16,reg16 - - 12 12 3-7