miércoles, 23 de enero de 2008

Ensamblador (Entrega 4)

Mas Ejemplos

En esta ocasión veremos algunos ejemplos prácticos de instrucciones típicas del lenguaje ensamblador, tales como INC y DEC. También notaremos los efectos que pueden producirse en las BANDERAS (flags) y, finalmente, cómo se puede implementar un sencillo ciclo WHILE en lenguaje ensamblador.



Fig. 1 El programa PRU.COM en ejecución

Ejemplo de la instrucción DEC

a) Se inicia el comando A para ENSAMBLAR el código
b) MOV AX,FF (carga el registro AX con FF = 255)
c) Usamos INTRO para volver a la línea de comandos de DEBUG
d) Con el comando G 100 ejecutamos el código que comienza en la posición 100 de la memoria. Luego con el comando P vemos la ejecución del comando en custión. Si observamos el registro AX, notamos que contiene FF tal como le instruimos a la CPU.
e) Nuevamente aplicamos el comando A para ensamblar código
f) DEC AX (decrementa el valor de AX)
g) Usamos INTRO para volver a la línea de comandos de DEBUG
h) Con el comando G 103 ejecutamos el código que comienza en la posición 103 de la memoria. Luego con el comando P vemos la ejecución del comando en custión. Nuevamente observamos el registro AX y notamos que su contenidos es FE, es decir que disminuyó en 1 su valor.
i) Finalmente con Q salimos de DEBUG.

-A
0DE3:0100 MOV AX,FF
0DE3:0103
-G 100
AX=0000 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=0DE3 ES=0DE3 SS=0DE3 CS=0DE3 IP=0100 NV UP EI PL NZ NA PO NC
0DE3:0100 B8FF00 MOV AX,00FF
-P
AX=00FF BX=0000 CX=0000 DX=0000 SP=FF
EE BP=0000 SI=0000 DI=0000
DS=0DE3 ES=0DE3 SS=0DE3 CS=0DE3 IP=0103 NV UP EI PL NZ NA PO NC
0DE3:0103 45 INC BP
-A
0DE3:0103 DEC AX
0DE3:0104
-G 103
AX=00FF BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=0DE3 ES=0DE3 SS=0DE3 CS=0DE3 IP=0103 NV UP EI PL NZ NA PO NC
0DE3:0103 48 DEC AX
-P
AX=00FE BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=0DE3 ES=0DE3 SS=0DE3 CS=0DE3 IP=0104 NV UP EI PL NZ NA PO NC
0DE3:0104 122A ADC CH,[BP+SI] SS:0000=CD
-Q


Ejemplo de la instrucción INC


-A
0DE3:0100 MOV AX,00
0DE3:0103
-G 100
AX=0000 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=0DE3 ES=0DE3 SS=0DE3 CS=0DE3 IP=0100 NV UP EI PL NZ NA PO NC
0DE3:0100 B80000 MOV AX,0000
-P
AX=0000 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=0DE3 ES=0DE3 SS=0DE3 CS=0DE3 IP=0103 NV UP EI PL NZ NA PO NC
0DE3:0103 45 INC BP
-A
0DE3:0103 INC AX
0DE3:0104
-G 103
AX=0000 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=0DE3 ES=0DE3 SS=0DE3 CS=0DE3 IP=0103 NV UP EI PL NZ NA PO NC
0DE3:0103 40 INC AX
-P
AX=0001 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=0DE3 ES=0DE3 SS=0DE3 CS=0DE3 IP=0104 NV UP EI PL NZ NA PO NC
0DE3:0104 122A ADC CH,[BP+SI] SS:0000=CD
-Q


Explicación:

En este ejemplo comenzamos cargando 0 en AX, luego aplicamos la instrucción INC AX y verificamos que efectivamente AX = 1

Pero veamos que ocurre en el siguiente ejemplo de la instrucción INC

a) Cargamos el registro AX con FFFF (el valor máximo que admite el registro, 65.535)

b) Incrementamos el contenidos de AX por medio de la instrucción INC…

c) Observamos que el registro AX quedó en 0. También se notan que el flag de cero está en ZR, es decir que cambió de NZ a ZR, esto significa que la operación tuvo por resultado cero. También cambió el flag de acarreo, que estaba en NA y pasa a AC lo que significa que hay un bit de acarreo.

-A
0DE3:0100 MOV AX,FFFF
0DE3:0103
-G 100
AX=0000 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=0DE3 ES=0DE3 SS=0DE3 CS=0DE3 IP=0100 NV UP EI PL NZ NA PO NC
0DE3:0100 B8FFFF MOV AX,FFFF
-P
AX=FFFF BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=0DE3 ES=0DE3 SS=0DE3 CS=0DE3 IP=0103 NV UP EI PL NZ NA PO NC
0DE3:0103 40 INC AX
-A
0DE3:0103 INC AX
0DE3:0104
-G 103
AX=FFFF BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=0DE3 ES=0DE3 SS=0DE3 CS=0DE3 IP=0103 NV UP EI PL NZ NA PO NC
0DE3:0103 40 INC AX
-P
AX=0000 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=0DE3 ES=0DE3 SS=0DE3 CS=0DE3 IP=0104 NV UP EI PL ZR AC PE NC
0DE3:0104 122A ADC CH,[BP+SI] SS:0000=CD
-Q

Ejemplo de la implementación de un ciclo WHILE

Crearemos un archivo de texto con EXACTAMENTE lo siguiente:

NPRU.COM
A
MOV AH,01
INT 21
CMP AL,0D
JNE 100
MOV AX,004C
INT 21


RCX
F
W
Q


Lo ensamblamos con el procedimiento explicado en entregas previas:


Observe la Fig. 1 que muestra el programa PRU en ejecución.

Explicación:

La opción AH=1 de la interrupción 21 permite leer un carácter tomado del teclado y mostrarlo por pantalla y guarda el carácter leído en AL.

El ciclo WHILE está implementado en la secuencia siguiente:


MOV AH,01
INT 21
CMP AL,0D
JNE 100


Básicamente la instrucción CMP permite comparar si el contenido de AL es igual a 0D (o 13 decimal que es INTRO).

La instrucción JNE significa “si no es igual, saltar” y el 100 es la posición a la que saltará el programa.

De este modo el ciclo se repite hasta que se teclea INTRO. Al teclear INTRO, el programa continúa con las instrucciones siguientes:


MOV AX,004C
INT 21


¡Y de ese modo finaliza el programa!


Sergio Otaño


0 comentarios: