Está en la página 1de 7

Práctica #2, Arquitectura de Computadores, Programa Ingeniería Electrónica UFPS, I-2021 1

PRACTICE No. 2. SUBPROGRAMS TO REPLACE THE


INSTRUCTIONS FOR THE 8086 MICROPROCESSORS NOT
SUPPORTED BY THE MSX88 SIMULATOR AND ITS ASSEMBLER.

J. A. Ramirez, cod. 1161215, Student UFPS

Abstract— In the following report we will work on III. JUSTIFICACION


the MSX88 simulator and how to create programs or
subroutines that allow executing actions in a more
efficient way, this in order to optimize the code and when La versión 3.0 MSX88 y su ensamblador fueron
implementing it, do it in a simpler way since it saves diseñados y construidos para simular un
characters when implement subroutines but not microprocesador y los procesos que se realizan dentro
commands. del mismo para ejecutar una instrucción y un programa.
Como tal, se implementaron gran parte de las
Index Terms— MSX 88, assembly language, virtual instrucciones del microprocesador 8086 excepto, entre
machine, DOSBOX, source language, source code, otras, aquellas que realizan desplazamientos de bits a
subroutines, instructions.
izquierda y derecha a través de un registro de propósito
general incluida la bandera de acarreo (CF).
I. INTRODUCCIÓN
IV. EQUIPOS Y MATERIALES NECESARIOS

L a presentación de este informe permite analizar las


subrutinas que el emulador no soporta, así mismo,
 MSX88 versión portable
el simulador no es capaz de realizar dichas rutinas de
 Editor de texto básico
forma directa, al crear estas sub rutinas se asegura que
todas las acciones sean incluidas de forma indirecta  Pendrive o flash drive
pero que estas se ejecuten de forma adecuada y no se  Cartilla de instrucciones del 8086
generen errores o comandos no reconocidos por dicho
simulador. V. MARCO TEORICO
Para esta práctica de laboratorio se presentará la
instrucción SAR, cuya función es el desplazamiento Desde su creación, el simulador MSX88 siempre tuvo
aritmético a la derecha de valores hexadecimales, para como objetivo ser una herramienta aplicada a la
ello se realizará en la herramienta MSX88. enseñanza de la electrónica y nunca la de ser un
emulador de un microprocesador tipo iAPx86; es por
II. OBJETIVOS ello que su ensamblador está restringido a un grupo
básico de instrucciones, pero tal como dice el autor,
A. Objetivo General
“esta circunstancia da pie a interesantes ejercicios de
rediseño de dicho código”.
Construir un subprograma (subrutina) que realice las
mismas funciones que una instrucción de Un ejemplo de este tipo de ejercicios es el presentado
desplazamiento y rotación de bits no soportada por el en la página de SlidePlayer.es para reemplazar otra
simulador MSX88 y su ensamblador. instrucción no soportada como el MUL.

B. Objetivos Específicos Tal es el caso de las nueve instrucciones de


desplazamiento y rotación:
1) Elaborar un programa que realice las mismas SAR Shift arithmetic right
funciones que una instrucción de desplazamiento y SHR Shift logical right
rotación de bits. SAL Shift arithmetic left
2) Hacer la documentación del programa: función, SHL Shift logical left
entradas, salidas, registros que afecta, entre otros. SHRD Shift right double
3) Construir un subprograma o subrutina que
SHLD Shift left double
reemplace la instrucción dentro de un programa
ROR Rotate right
principal.
ROL Rotate left
RCR Rotate through carry right

April - 2021
J A. Ramírez, is with the Universidad Francisco de Paula Santander, (-mail: julianoandresrm@ufps.edu.co) Norte de Santander, Cúcuta, Colombia.
Práctica #2, Arquitectura de Computadores, Programa Ingeniería Electrónica UFPS, I-2021 2

RCL Rotate through carry left 2006 F4 6 HLT


7 END
VI. TRABAJO PREVIO
Estudiar al detalle la función que realiza la instrucción Lo que corrobora que la instrucción no está soportada
de desplazamiento y rotación seleccionada, su por el ensamblador.
interacción con las banderas de Carry y Zero (CF y ZF) Modificamos el programa para obtener el mismo
y la inserción o eliminación de bits. objetivo:

ORG 2000H
VII. DESARROLLO DE LA PRACTICA
mov al, 065h

Se plantea un programa para convertir un número mov bl, al ; se respalda el número binario a
binario natural a código binario Gray. El ejemplo se convertir.
muestra a continuación: mov ah, 00h ; clareamos el registro AH para alojar
el resultado allí.
ORG 2000H mov cl, 07h ; el algoritmo consiste en sumar el
MOV AL, 065h número expresado en 16 bits
MOV BL, AL l1: add ax, ax ; registro AX consigo mismo, igual que
SHR BL, 01h multiplicar X 2 o
XOR AL, BL dec cl ; lo mismo que desplazar a la izquierda todo
HLT el número binario,
END jnz l1 ; de hacerlo ocho veces el binario se traslada
al registro AH,
En el momento de hacer la compilación, el MSX 88 mov al, bl ; desplazar siete veces es similar a tener
arroja el error ilustrado en la Figura 1 el número original
mov bl, ah ; desplazado a la derecha una posición
en el registro AH.

xor al, bl ; se construye el binario gray y se


almacena en el AL.
hlt
END

Logramos obtener el resultado previsto: AL= 57H

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
Figura 1. Error de compilación en el MSX88 serían necesarias ocho instrucciones, en este caso, para
reemplazar la instrucción requerida. Para resolver el
Y según el respectivo listado que arroja el MSX88 se problema acudimos a elaborar por única vez un
debe a un error en la instrucción: programa al que llamaremos subrutina (función,
procedimiento o subprograma en otros lenguajes de
Listado Fuente: bin2gray.LST alto nivel), que para el ensamblador del MSX88 tiene
Programa Fuente en: bin2gray.asm unas reglas básicas de construcción que las veremos en
Fecha: Fri Apr 03 11:57:01 2020 seguida:

ÚDir.ÚCodigo máquina Línea ÚCodigo en 1. A partir del programa principal trasladamos


lenguaje ensamble las instrucciones de la subrutina al principio
1 ORG 2000H del texto. En ese espacio en blanco que deja
2000 B0 65 2 MOV AL, 065h este movimiento escribimos la instrucción
2002 8A D8 3 MOV BL, CALL.
AL 2. Como se requiere una directiva de ORG,
4 SHR BL, 01h utilizamos una en una dirección posterior y
Error: (null). alejada de la dirección que por defecto
2004 32 C3 5 XOR AL, BL debemos darle al programa principal. De

April - 2021
J A. Ramírez, is with the Universidad Francisco de Paula Santander, (-mail: julianoandresrm@ufps.edu.co) Norte de Santander, Cúcuta, Colombia.
Práctica #2, Arquitectura de Computadores, Programa Ingeniería Electrónica UFPS, I-2021 3

existir varias subrutinas es necesario tener en Entrada: Número binario natural entre 00000000B y
cuenta que deben estar suficientemente 11111111B en los registros AL y BL.
separadas para que no se traslapen. En nuestro Salida: Número binario natural desplazado a la derecha
caso ORG 3000H. un bit entre 00000000B y 01111111B en el registro
3. Le colocamos a la primera instrucción de la BL.
subrutina una etiqueta que en adelante servirá Registros que usa: AX, BL, CL y FR.
para identificarla y acceder a ella desde el Subrutinas que llama: ninguna.
programa principal. Si se quiere se pueden Como conclusión esta subrutina no reemplaza
cambiar las etiquetas de salto para ordenar completamente la instrucción SHR BL, 01h pero si
mejor el texto; de todas formas no deben funciona para los propósitos de nuestro programa. Cada
existir dos etiquetas con el mismo nombre en grupo debe hacer lo propio con la instrucción que
todo el programa porque producirá un error en hayan seleccionado, solo se puede repetir una sola
la compilación. instrucción por grupo.
4. Al final de la subrutina se adicional la
instrucción RET; esto permitirá que la SAR Shift arithmetic right
ejecución del programa retorne a la SAL Shift arithmetic left
instrucción siguiente a la instrucción que la SHL Shift logical left
llamó, el CALL que colocamos en el punto 1, SHRD Shift right double
o sea que después resuelta la instrucción RET, SHLD Shift left double
la siguiente instrucción que se ejecuta, en este ROR Rotate right
ejemplo, es xor al, bl. ROL Rotate left
5. La instrucción CALL obliga al programa a RCR Rotate through carry right
realizar un salto, por lo tanto, esta instrucción RCL Rotate through carry left
debe tener una etiqueta que direccione el La subrutina debe hacer parte de un programa principal
programa hacia la subrutina, en nuestro caso y debe funcionar para cualquier valor de entrada de
sub1. código binario natural de ocho bits (00000000B –
11111111B)
Finalmente, nuestro programa queda así:
VIII. EVALUACION
ORG 3000H
sub1: mov ah, 00h ;\
mov cl, 07h ; | a. Hacer un listado de las instrucciones del
s1: add ax, ax ; \ microprocesador 8086 no soportadas por el
dec cl ; | shr bl, 01h simulador MSX88 y su ensamblador.
jnz s1 ; /
Las instrucciones del microprocesador 8086 no
mov al, bl ; |
soportadas por el simulador MSX88 y su
mov bl, ah ; /
ensamblador, se dividen en:
ret
Instrucciones de transferencia de datos
ORG 2000H
mov al, 065h
 XCHG reg., {reg|mem} Intercambia ambos
mov bl, al
valores
call sub1  XLAT Realiza una operación de traducción de
un código de un byte a otro código de un byte
mediante una tabla. Operación: AL <-
xor al, bl
[BX+AL]
hlt
END  LEA reg., mem Almacena la dirección
efectiva del operando de memoria en un
registro.
Documentemos la subrutina:
Operación: reg <- dirección mem
 LDS reg, mem32 Operación: reg <- [mem],
Nombre: sub1
DS <- [mem+2]
Función: Desplaza el contenido del registro BL bit por
bit una posición a la derecha. La subrutina no lleva el  LES reg, mem32 Operación: reg <- [mem],
bit de menor peso a la bandera de Carry pero si inserta ES <- [mem+2]
un bit 0 en el bit de mayor peso del registro.

April - 2021
J A. Ramírez, is with the Universidad Francisco de Paula Santander, (-mail: julianoandresrm@ufps.edu.co) Norte de Santander, Cúcuta, Colombia.
Práctica #2, Arquitectura de Computadores, Programa Ingeniería Electrónica UFPS, I-2021 4

 LAHF Copia en el registro AH la imagen de  ROL dest, {1|CL} Realiza una rotación hacia
los ocho bits menos significativos del registro la izquierda.
de indicadores. Operación: AH <- SF:  ROR dest, {1|CL} Realiza una rotación hacia
ZF:X:AF:X:PF:X:CF la derecha.
 SAHF Almacena en los ocho bits menos  RCL dest, {1|CL} Realiza una rotación hacia
significativos del registro de indicadores el la izquierda usando el CF
valor del registro AH. Operación: SF:  RCR dest, {1|CL} Realiza una rotación hacia
ZF:X:AF:X:PF:X:CF <- AH la derecha usando el CF.

Instrucciones aritméticas NOTA: En las siete instrucciones anteriores la cantidad


de veces que se rota o desplaza puede ser un bit o la
 DAA Corrige el resultado de una suma de dos cantidad de bits indicado en CL.
valores BCD empaquetados en el registro AL
(debe estar inmediatamente después de una Instrucciones de manipulación de cadenas
instrucción ADD o ADC). OF es indefinido
después de la operación  MOVSB
 DAS Igual que DAA, pero para resta (debe Copiar un byte de la cadena fuente al destino.
estar inmediatamente después de una Operación:
instrucción SUB o SBB) ES: [DI] <- DS: [SI] (un byte)
 AAA Lo mismo que DAA para números BCD DI <- DI±1
desempaquetados. SI <- SI±1
 AAS Lo mismo que DAS para números BCD
desempaquetados.  MOVSW
 AAD Convierte AH:AL en BCD Copiar dos bytes de la cadena fuente al destino.
desempaquetado a AL en binario. Operación:
 AAM Convierte AL en binario a AH:AL en ES: [DI] <- DS: [SI] (dos bytes)
BCD desempaquetado. DI <- DI±2
 MUL {reg8|mem8} Realiza una SI <- SI±2
multiplicación con operandos no signados de 8
por 8 bits.  LODSB
Operación: AX <- AL * {reg8|mem8}. Poner en el acumulado un byte de la cadena
CF=OF=0 si AH = 0, CF=OF=1 en caso fuente.
contrario. AF, PF, SF, ZF quedan indefinidos. Operación:
 IMUL {reg8|mem8} Realiza una AL <- DS: [SI] (un byte)
multiplicación con operandos con signo de 8 SI <- SI±1
por 8 bits.
Operación: AX <- AL * {reg8|mem8}  LODSW
realizando la multiplicación con signo. CF = Poner en el acumulador dos bytes de la cadena
OF = 0 si el resultado entra en un byte, en caso fuente.
contrario valdrán 1. AF, PF, SF, ZF quedan Operación:
indefinidos. AX <- DS: [SI] (dos bytes)
 CBW Extiende el signo de AL en AX. No se SI <- SI±2
afectan los flags.
 CWD Extiende el signo de AX en DX:AX.  STOSB
No se afectan flags. Almacenar en la cadena destino un byte del
acumulador.
Instrucciones lógicas Operación:
ES: [DI] <- AL (un byte)
 SHL/SAL dest, {1|CL} Realiza un DI <- DI±1
desplazamiento lógico o aritmético a la
izquierda.  STOSW
 SHR dest, {1|CL} Realiza un desplazamiento Almacenar en la cadena destino dos bytes del
lógico a la derecha. acumulador.
 SAR dest, {1|CL} Realiza un desplazamiento Operación:
aritmético a la derecha. ES: [DI] <- AX (dos bytes)
DI <- DI±2

April - 2021
J A. Ramírez, is with the Universidad Francisco de Paula Santander, (-mail: julianoandresrm@ufps.edu.co) Norte de Santander, Cúcuta, Colombia.
Práctica #2, Arquitectura de Computadores, Programa Ingeniería Electrónica UFPS, I-2021 5

 JB etiqueta/JNAE etiqueta Saltar a etiqueta si


 CMPSB es menor.
Comparar un byte de la cadena fuente con el  JBE etiqueta/JNA etiqueta Saltar a etiqueta si
destino. es menor o igual.
Operación:  JE etiqueta Saltar a etiqueta si es igual.
DS: [SI] - ES: [DI] (Un byte, afecta sólo los  JNE etiqueta Saltar a etiqueta si es distinto.
flags)  JAE etiqueta/JNB etiqueta Saltar a etiqueta si
DI <- DI±1 es mayor o igual.
SI <- SI±1  JA etiqueta/JNBE etiqueta Saltar a etiqueta si
es mayor.
 CMPSW  JP/JPE label Saltar si la paridad es par (PF =
Comparar dos bytes de la cadena fuente con el 1).
destino.  JNP/JPO label Saltar si la paridad es impar
Operación: (PF = 0). Saltos condicionales que usan el
DS: [SI] - ES: [DI] (Dos bytes, afecta sólo los registro CX como contador:
flags)  LOOP label Operación: CX <- CX-1. Saltar a
DI <- DI±2 label si CX<>0.
SI <- SI±2
 LOOPZ/LOOPE label Operación: CX <-
CX-1. Saltar a label si CX <> 0 y ZF = 1.
 SCASB
 LOOPNZ/LOOPNE label Operación: CX <-
Comparar un byte del acumulador con la cadena
CX-1. Saltar a label si CX <> 0 y ZF = 0.
destino.
 JCXZ label Operación: Salta a label si CX =
Operación:
0.
AL - ES: [DI] (Un byte, afecta sólo los flags)
DI <- DI±1
Instrucciones de control del procesador
 SCASW
 CLC CF <- 0.
Comparar dos bytes del acumulador con la
cadena destino.  STC CF <- 1.
Operación:  CMC CF <- 1 - CF.
AX - ES: [DI] (Dos bytes, afecta sólo los flags)  CLD DF <- 0 (Dirección ascendente).
DI <- DI±2  STD DF <- 1 (Dirección descendente).
 WAIT Detiene la ejecución del procesador
NOTA: En todos los casos el signo + se toma si el hasta que se active el pin TEST del mismo.
indicador DF vale cero. Si vale 1 hay que tomar el  LOCK Prefijo de instrucción que activa el pin
signo –. LOCK del procesador.

 REP: Repetir la instrucción CX veces. b. Documentar la subrutina de acuerdo con la


 REPZ/REPE: Repetir mientras que sean teoría vista en clase: Nombre, función,
iguales hasta un máximo de CX veces. entradas, salidas y registros que utiliza.
 REPNZ/REPNE: Repetir mientras que sean
diferentes hasta un máximo de CX veces. La subrutina trabajada en este caso es SAR

Instrucciones de transferencia de control El código a implementar fue el siguiente:

 JL etiqueta/JNGE etiqueta Saltar a etiqueta si ORG 2000H


es menor. MOV AX, 16d
 JLE etiqueta/JNG etiqueta Saltar a etiqueta si MOV BX, 3h
es menor o igual.
INCIO:MOV DX, AX
 JE etiqueta Saltar a etiqueta si es igual.
AND DX, 1H
 JNE etiqueta Saltar a etiqueta si es distinto.
XOR DX, 0H
 JGE etiqueta/JNL etiqueta Saltar a etiqueta si
SUB AX, DX
es mayor o igual.
 JG etiqueta/JNLE etiqueta Saltar a etiqueta si DIVISION: INC CX
es mayor. SUB AX, 2H

April - 2021
J A. Ramírez, is with the Universidad Francisco de Paula Santander, (-mail: julianoandresrm@ufps.edu.co) Norte de Santander, Cúcuta, Colombia.
Práctica #2, Arquitectura de Computadores, Programa Ingeniería Electrónica UFPS, I-2021 6

JNZ DIVISION
MOV AX, CX
MOV CX, 0H

SUB BX,1H
JNZ INCIO
END

Figura 4. Finalización del programa comprobando su


correcta función.

c. Observar los cambios que se presentan en los


Figura 2. Montaje de programa fichero al DOSBOX registros IP, SP, FR y las direcciones de memoria
apuntadas por el registro SP durante la ejecución
del programa. Escriba sus observaciones.

El registro SP varía cuando es llamada la subrutina y


posteriormente cuando la subrutina retorna el registro
vuelve a la posición que estaba antes de ejecutarse la
subrutina. El 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.

IX. CONCLUSIONES
Se logró comprender el concepto de registro ax, bx,
cx, dx, y selección de las variables pertinentes para el
lenguaje de ensamblador.

Se pudo codificar y verificar con la herramienta


Figura 3. Programa ejecutándose en el MSX88 msx88 el proceso de la instrucción SAR, asignando
algunos movimientos en el valor correspondiente.

Se analizo y entendió como adaptar una instrucción


del EMU 80X86 no soportada por el programa MSX88

X. BIBLIOGRAFIA

[1] R. Martínez. “Msx88: Una herramienta para la


enseñanza de la estructura y funcionamiento de los
ordenadores”. TAEE 94. I Congreso de Tecnologías
Aplicadas a la Enseñanza de la Electrónica. Madrid, 1994.
Sesión D2. Microprocesadores y sistemas basados en
microprocesador.

April - 2021
J A. Ramírez, is with the Universidad Francisco de Paula Santander, (-mail: julianoandresrm@ufps.edu.co) Norte de Santander, Cúcuta, Colombia.
Práctica #2, Arquitectura de Computadores, Programa Ingeniería Electrónica UFPS, I-2021 7

[2] I. Belmonte de la Fuente. “Clase 6. Assembly –


Simulador MSX88. Subrutinas”. 2019.
[Online] 2020. Disponible:
https://slideplayer.es/slide/13691020/

[3] A. Intel. “Volumen 1: Basic Architecture” U.S.A.


1997. Software Developer ́s Manual.

April - 2021
J A. Ramírez, is with the Universidad Francisco de Paula Santander, (-mail: julianoandresrm@ufps.edu.co) Norte de Santander, Cúcuta, Colombia.

También podría gustarte