Documentos de Académico
Documentos de Profesional
Documentos de Cultura
1. OBJETIVOS
Construir un subprograma (subrutina) que realice las mismas funciones que una instrucción
de desplazamiento y rotación de bits no soportada por el simulador MSX88 y su
ensamblador.
Elaborar un programa que realice las mismas funciones que una instrucción de
desplazamiento y rotación de bits.
Hacer la documentación del programa: función, entradas, salidas, registros que afecta,
entre otros.
Construir un subprograma o subrutina que reemplace la instrucción dentro de un programa
principal.
2. JUSTIFICACIÓN
Página 1 de 14
Cartilla de instrucciones del 8086
4. MARCO TEÓRICO
Desde su creación, el simulador MSX88 siempre tuvo como objetivo ser una herramienta
aplicada a la enseñanza de la electrónica y nunca la de ser un emulador de un
microprocesador tipo iAPx86; es por ello que su ensamblador está restringido a un grupo
básico de instrucciones, pero tal como dice el autor, “esta circunstancia da pie a interesantes
ejercicios de rediseño de dicho código” [1].
5. TRABAJO PREVIO:
6. DESARROLLO DE LA PRÁCTICA
Se plantea un programa para convertir un número binario natural a código binario Gray. El
ejemplo se muestra a continuación:
ORG 2000H
MOV AL, 065h
MOV BL, AL
SHR BL, 01h
XOR AL,BL
Arquitectura de Computadores – Autor Sergio Iván Quintero Ayala
Página 2 de 14
HLT
END
1 ORG 2000H
2000 B0 65 2 MOV AL, 065h
2002 8A D8 3 MOV BL, AL
4 SHR BL, 01h
Error: (null).
2004 32 C3 5 XOR AL, BL
2006 F4 6 HLT
7 END
Arquitectura de Computadores – Autor Sergio Iván Quintero Ayala
Página 3 de 14
Lo que corrobora que la instrucción no está soportada por el ensamblador.
ORG 2000H
mov al, 065h
Pero si necesitáramos utilizar varias veces la instrucción SHR BL, 01H dentro de un
programa de mayor tamaño, su extensión crecería aún más porque serían necesarias ocho
instrucciones, en este caso, para reemplazar la instrucción requerida. Para resolver el
problema acudimos a elaborar por única vez un programa al que llamaremos subrutina
(función, procedimiento o subprograma en otros lenguajes de alto nivel), que para el
ensamblador del MSX88 tiene unas reglas básicas de construcción que las veremos en
seguida:
Página 4 de 14
4. Al final de la subrutina se adicional la instrucción RET; esto permitirá que la ejecución
del programa retorne a la instrucción siguiente a la instrucción que la llamó, el CALL
que colocamos en el punto 1, o sea que después resuelta la instrucción RET, la
siguiente instrucción que se ejecuta, en este ejemplo, es xor al, bl.
5. La instrucción CALL obliga al programa a realizar un salto, por lo tanto esta instrucción
debe tener una etiqueta que direccione el programa hacia la subrutina, en nuestro
caso sub1.
ORG 3000H
sub1: mov ah, 00h ;\
mov cl, 07h ;|
s1: add ax, ax ;\
dec cl ; | shr bl, 01h
jnz s1 ;/
mov al, bl ;|
mov bl, ah ;/
ret
ORG 2000H
mov al, 065h
mov bl, al
call sub1
xor al, bl
hlt
END
Documentemos la subrutina:
Nombre: sub1
Función: Desplaza el contenido del registro BL bit por bit una posición a la derecha. La
subrutina no lleva el bit de menor peso a la bandera de Carry pero si inserta un bit 0 en el bit
de mayor peso del registro.
Entrada: Número binario natural entre 00000000B y 11111111B en los registros AL y BL.
Salida: Número binario natural desplazado a la derecha un bit entre 00000000B y 01111111B
en el registro BL.
Registros que usa: AX, BL, CL y FR.
Subrutinas que llama: ninguna.
Como conclusión esta subrutina no reemplaza completamente la instrucción SHR BL, 01h
pero si funciona para los propósitos de nuestro programa.
Página 5 de 14
Cada grupo debe hacer lo propio con la instrucción que hayan seleccionado, solo se puede
repetir una sola instrucción por grupo.
La subrutina debe hacer parte de un programa principal y debe funcionar para cualquier valor
de entrada de código binario natural de ocho bits (00000000B – 11111111B)
7. EVALUACIÓN
Instrucciones Aritméticas (Afectan los flags AF, CF, OF, PF, SF, ZF):
Página 6 de 14
AAA: Lo mismo que DAA para números BCD desempaquetados.
AAS: Lo mismo que DAS para números BCD desempaquetados.
AAD: Convierte AH: AL en BCD desempaquetado a AL en binario. Operación: AL
<- AH * 0Ah + AL, AH <- 0. Afecta PF, SF, ZF, mientras que AF, CF y OF quedan
indefinidos.
AAM: Convierte AL en binario a AH: AL en BCD desempaquetado. Operación: AH
<- AL / 0Ah, AL <- AL mod 0Ah. Afecta PF, SF, ZF, mientras que AF, CF y OF
quedan indefinidos.
MUL:
{reg16|mem16}
Realiza una multiplicación con operandos no signados de 16 por 16 bits.
Operación: DX: AX <- AX * {reg16|mem16}. CF=OF=0 si DX = 0, CF=OF=1 en caso
contrario. AF, PF, SF, ZF quedan indefinidos.
IMUL:
{reg8|mem8}. Realiza una multiplicación con operandos con signo de 8 por 8 bits.
Operación: AX <- AL * {reg8|mem8} realizando la multiplicación con signo. CF = OF
= 0 si el resultado entra en un byte, en caso contrario valdrán 1. AF, PF, SF, ZF
quedan indefinidos.
{reg16|mem16}
Realiza una multiplicación con operandos con signo de 16 por 16 bits.
Operación: DX: AX <- AX * {reg16|mem16} realizando la multiplicación con signo.
CF = OF = 0 si el resultado entra en dos bytes, en caso contrario valdrán 1. AF, PF,
SF, ZF quedan indefinidos.
TEST: dest, src. Operación: dest and src. Sólo afecta flags.
SHL/SAL: dest, {1|CL}. Realiza un desplazamiento lógico o aritmético a la
izquierda.
SHR: dest, {1|CL}. Realiza un desplazamiento lógico a la derecha.
SAR: dest, {1|CL}. Realiza un desplazamiento aritmético a la derecha.
ROL: dest, {1|CL}. Realiza una rotación hacia la izquierda.
ROR: dest, {1|CL}. Realiza una rotación hacia la derecha.
Arquitectura de Computadores – Autor Sergio Iván Quintero Ayala
Página 7 de 14
RCL: dest, {1|CL}. Realiza una rotación hacia la izquierda usando el CF.
RCR: dest, {1|CL}. Realiza una rotación hacia la derecha usando el CF.
En las siete instrucciones anteriores la cantidad de veces que se rota o desplaza puede ser
un bit o la cantidad de bits indicado en CL.
MOVSB:
MOVSW:
LODSB:
LODSW:
STOSB:
Página 8 de 14
STOSW:
CMPSB:
CMPSW:
SCASB:
SCASW:
En todos los casos el signo + se toma si el indicador DF vale cero. Si vale 1 hay
que tomar el signo -.
Página 9 de 14
REP: Repetir la instrucción CX veces.
Prefijos para las instrucciones CMPSB, CMPSW, SCASB, SCASW:
Página 10 de 14
LOOPNZ / LOOPNE: label. Operación: CX <- CX-1. Saltar a label si CX <> 0 y ZF =
0.
JCXZ: label. Operación: Salta a label si CX = 0.
CLC: CF <- 0.
STC: CF <- 1.
CMC: CF <- 1 - CF
CLD: DF <- 0 (Dirección ascendente).
STD: DF <- 1 (Dirección descendente).
WAIT: Detiene la ejecución del procesador hasta que se active el pin TEST del
mismo.
LOCK: Prefijo de instrucción que activa el pin LOCK del procesador.
Planteamos un programa para convertir un número binario natural a código binario Gray,
para este caso es necesario elaborarlo con la instrucción ROR. El ejemplo se muestra a
continuación:
ORG 2000H
Como la instrucción no está soportada por el ensamblador, debemos utilizar las instrucciones
que soporta el MSX88, y elaborar un programa que elabore lo que en su caso haría la
instrucción ROR. El ejemplo se muestra a continuación:
Página 11 de 14
ORG 2000H
hlt
Pero si necesitáramos utilizar varias veces la instrucción ROR BL, 01H dentro de un
programa de mayor tamaño, su extensión crecería aún más porque serían necesarias ocho
instrucciones, en este caso, para reemplazar la instrucción requerida. Para resolver el
problema acudimos a elaborar por única vez un programa al que llamaremos subrutina
(función, procedimiento o subprograma en otros lenguajes de alto nivel), que para el
ensamblador del MSX88 tiene unas reglas básicas de construcción que las veremos en
seguida:
ORG 3000h
jz s2
Arquitectura de Computadores – Autor Sergio Iván Quintero Ayala
Página 12 de 14
add bl, 080h
xor al,ah
s2: ret
ORG 2000H
call sub1
hlt
END
END
Documentando la subrutina:
Nombre: sub1
Función: Genera la rotación bit por bit una posición la derecha, del bit menos significativo al
más significativo en el registro Ax (AH-AL). La subrutina no lleva el bit de menor peso a la
bandera de Carry.
Entrada: Funciona para cualquier valor de entrada de código binario natural de ocho bits
(00000000B – 11111111B)
c. Observar los cambios que se presentan en los registros IP, SP, FR y las direcciones
de memoria apuntadas por el registro SP durante la ejecución del programa. Escriba
sus observaciones.
Página 13 de 14
registro IP va variando a medida que se ejecuta el código, mostrando la dirección donde se
está realizando la instrucción ya sea antes, durante y después de ser llamada la subrutina.
8. BIBLIOGRAFÍA
[3] A. Intel. “Volumen 1: Basic Architecture” U.S.A. 1997. Software Developer´s Manual.
Página 14 de 14