Está en la página 1de 46

UNIVERSIDAD NACIONAL DE SAN AGUSTÍN

Facultad De Ingeniería De Producción y Servicios


Escuela Profesional De Ingeniería Electrónica

Curso: Arquitectura de Computadoras

Turno: B

Horario: Viernes de 8:50 a 10:30 am

Número de grupo: LV4

Título de la Práctica:

Número de Práctica: 2

Apellidos y Nombres:

Flores Arela, Saul Orlando | 20181589

Lopez Colque Nikolai Admin | 20180251

Mendoza Portillo, Harold | 20182229

Fecha de Entrega: 26-09-2021


ÍNDICE

DESARROLLO 3
8086/88 Device Specifications 3
8086/88 Pinout 4
8086/88 Pinout 5
8086/88 Pinout 5
8086/88 Pinout 6
8086/88 Pinout 7
8284A Clock Generator 8
8284A Clock Generator 8
8284A Clock Generator 9
8284A Clock Generator 10
Búfer y enclavamiento de BUS 10
BUS Buffering and Latching 11
Sincronización del BUS 11
Sincronización del BUS. 12
Sincronización del BUS 12
BUS Timing 13
Sincronización del BUS 14
Sincronización del BUS 15
Modo MIN y MAX 16
8288 Bus Controller 16
Modo MAX 8086 Sistema 17

DECODIFICADOR DE LENGUAJE MÁQUINA DEL PROCESADOR INTEL 8088 18


Introducción 18
Formato de instrucción ‘mov’ 18
Registros 22
Siguiente instrucción 23
Código en ensamblador 23

Conclusiones 24

2
DESARROLLO

1. Pinout microprocesador 8088 con descripción del mismo

8086/88 Device Specifications


● Both are packaged in DIP (Dual In-Line Packages).
● 8086: 16-bit microprocessor with a 16-bit data bus.
microprocesador con bus de datos de 16bits.
● 8088: 16-bit microprocessor with an 8-bit data bus.
Microprocesador con bus de datos de 8 bits

● Both are 5V parts:


● 8086: Draws a maximum supply current of 360mA. Corriente de
suministro de 360mA.
● 8086: Draws a maximum supply current of 340mA. Máximo
suministro de corriente de 340mA.

3
● 80C86/80C88: CMOS version draws 10mA with temp spec -40 to
225degF. La versión CMOS consume 10 mA con especificaciones de
temperatura de -40 a 225 ° F.
● versión CMOS
● Input/Output current levels:

Produce una inmunidad al ruido de 350 mV para lógica 0 (la salida


máxima puede ser tan alta como 450 mV, mientras que la entrada
máxima no puede ser superior a 800 mV).
Esto limita la carga en las salidas.

8086/88 Pinout
● Pin functions:
● AD15-AD0
○ Dirección multiplexada (ALE = 1) / bus de
datos (ALE = 0).
● A19/S6-A16/S3 (multiplexed)
○ 4 bits de orden superior de la dirección de 20
bits O bits de estado S6-S3.
● M/IO
○ Indica si la dirección es una dirección de
memoria o E/S.
● RD
○ Cuando es 0, el bus de datos es impulsado por
la memoria o un dispositivo de E / S.

● WR
○ El microprocesador conduce el bus de datos a
la memoria o un dispositivo de E / S. Cuando
es 0, el bus de datos contiene datos válidos.
● ALE (Address latch enable)

4
○ Cuando es 1, el bus de datos de dirección
contiene una dirección de memoria o de E / S.
● DT/R (Data Transmit/Receive)
○ El bus de datos transmite/recibe datos.
● DEN (Data bus Enable)
○ Activa los búferes de bus de datos externos.
8086/88 Pinout
● Pin functions:
● S7, S6, S5, S4, S3, S2, S1, S0
○ S7: Logic 1, S6: Logic 0. S7: 1 lógico. S6:
0logico
○ S5: Indicates condition of IF flag bits.
Condición de los bits de bandera IF.
○ S4-S3: Indique a qué segmento se accede
durante el ciclo de bus actual:

● S2, S1, S0 :Indicar la función del ciclo de bus


actual (decoded by 8288).

8086/88 Pinout
● Funciones de los Pines:
● INTR

5
○ Cuando 1 e IF = 1, el microprocesador se
prepara para interrumpir el servicio. INTA se
activa después de que se completa la
instrucción actual.
● INTA
○ Interrupt Acknowledge Reconocimiento de
interrupción generado por el microprocesador
en respuesta a INTR. Hace que el vector de
interrupción se coloque en el bus de datos.
● NMI
○ (Non-maskable interrupt). Interrupción no
enmascarable. Similar a INTR, excepto que el
bit indicador IF no se consulta y la
interrupción es el vector 2.

● CLK
○ La entrada de reloj debe tener un ciclo de
trabajo del 33% (alto para 1/3 y bajo para 2/3
s)
● VCC/GND
○ Fuente de alimentación (5V) y GND (0V).
8086/88 Pinout
● Funciones de los Pines:

● MN/ MX
○ Select minimum (5V) or maximum mode (0V)
of operation.
● BHE
○ Bus High Enable. Enables the most significant
data bus bits (D 15 -D 8 ) during a read or
write operation.

6
● READY
○ Used to insert wait states (controlled by
memory and IO for reads/writes) into the
microprocessor.
● RESET
○ Microprocessor resets if this pin is held high
for 4 clock periods.
○ Instruction execution begins at FFFF0H and
IF flag is cleared.

● TEST
○ An input that is tested by the WAIT instruction.
○ Commonly connected to the 8087 coprocessor.
8086/88 Pinout
● Pin functions:
● HOLD
○ Solicita un acceso directo a memoria (DMA).
Cuando es 1, el microprocesador se detiene y
coloca la dirección, los datos y el bus de
control en estado de alta impedancia.
● HLDA (Hold Acknowledge)
○ Indica que el microprocesador ha entrado en
estado de espera.
● RO/GT1 and RO/GT0
○ Solicitar / otorgar pines solicitud / otorgar
accesos directos a memoria (DMA) durante la
operación de modo máximo.

● LOCK
○ La salida de bloqueo se utiliza para bloquear
los periféricos del sistema. Se activa usando el
prefijo LOCK: en cualquier instrucción.
● QS1 and QS0

7
○ Los bits de estado de la cola muestran el
estado de la cola de instrucciones internas.
Proporcionado para el acceso por el
coprocesador numérico (8087).
8284A Clock Generator
● Funciones Básicas:
● Clock generation. - Generación de reloj
● RESET synchronization. - Restablecer la sincronización.
● READY synchronization. - Sincronización lista.
● Peripheral clock signal. - Señal de reloj periferico.

● Connection of the 8284 and the 8086.

8284A Clock Generator

8
8284A Clock Generator
● Clock generation:
○ Crystal está conectado a X1 y X2.
○ XTAL OSC genera una señal de onda
cuadrada a la frecuencia del cristal que
alimenta:
● Un búfer inversor (salida OSC) que se utiliza para impulsar la
entrada EFI de otros 8284A.
● 2-to-1 MUX
○ F / C selecciona la entrada externa XTAL
o EFI.
○ El MUX maneja un contador de división por 3
(15MHz a 5MHz).
○ This drives:
● El flip-flop listo (sincronización lista).
● Un segundo contador de división por 2 (clk de 2,5 MHz para
componentes periféricos).
● Reiniciar el flipflop
● CLK que impulsa la entrada CLK del 8086.

9
8284A Clock Generator
● RESET:
○ El flipflop activado por flanco negativo aplica
la señal RESET al 8086 en el flanco
descendente.
○ El 8086 muestrea el pin RESET en el flanco
ascendente.

● El tiempo de reinicio correcto requiere que la


entrada de RESET al microprocesador se convierta
en un 1 NO MÁS TARDE de 4 relojes después del
encendido y que permanezca alto durante al menos
50us.
Búfer y enclavamiento de BUS
● Demultiplexado de los autobuses:
○ Los sistemas informáticos tienen tres buses:
● Address
● Data
● Control

● La dirección y el bus de datos están multiplexados


(compartidos) debido a las limitaciones de los pines
en el 8086.

10
○ El pin ALE controla un conjunto de
pestillos.
● Todas las señales DEBEN tener un búfer.
○ Cierres amortiguadores para A 0 -A 15 .
○ Control y A 16 -A 19 + BHE se
almacenan en búfer por separado
○ Los búferes de bus de datos deben ser
búferes bidireccionales (BB).

● BHE : Selects the high-order memory bank.


Selecciona el banco de memoria de orden superior.
BUS Buffering and Latching

Sincronización del BUS


● Escribiendo
● Cambiar la dirección en el bus de direcciones.

11
● Cambiar los datos en el bus de datos.
● Emita una escritura y configure M/ E/S en 1.

Sincronización del BUS.


Reading:
● Cambiar la dirección en el bus de direcciones.
● Emita una lectura y configures M / E/S en 1
● Esperar por el ciclo de memoria

Sincronización del BUS

12
● Sincronización del BUS:

BUS Timing

● Durante T 1 :
● La dirección se coloca en el bus de dirección / datos.
● Las señales de control M / IO, ALE y DT / R especifican
memoria o E / S, enganchan la dirección en el bus de
direcciones y establecen la dirección de transferencia de datos
en el bus de datos.
● Durante T 2 :
● 8086 emite la señal RD o WR, DEN y, para una escritura, los
datos.
○ DEN permite que la memoria o el
dispositivo de E / S reciba los datos para
las escrituras y el 8086 los reciba para las
lecturas.
● Durante T 3 :

13
● Este ciclo se proporciona para permitir que la memoria acceda
a los datos.
● Se muestra listo al final T 2 .
○ Si está bajo, T 3 cambia a espera.
○ Caso contrario, el bus de datos se
muestrea al final deT 3 .

● Durante T 4 :
● Todas las señales de bus se desactivan, en preparación para el
próximo ciclo de bus.
● Los datos se muestrean para las lecturas, las escrituras se
producen para las escrituras.
Sincronización del BUS
● Sincronización:
○ Cada CICLO DE BUS en el 8086 equivale a
cuatro períodos de reloj del sistema (estados
T).
○ La frecuencia de reloj es de 5 MHz, por lo
tanto, un ciclo de bus es de 800 ns.
○ La tasa de transferencia es de 1,25 MHz.

● Las especificaciones de la memoria (tiempo de


acceso a la memoria) deben coincidir con las
limitaciones de la sincronización del sistema.

● Por ejemplo, la sincronización del bus para una


operación de lectura muestra que se necesitan casi
600 ns para leer datos.
○ Sin embargo, la memoria debe acceder
más rápido debido a los tiempos de

14
configuración, p. Ej. Configuración de
direcciones y configuración de datos.
○ Esto resta alrededor de 150ns.
○ Por lo tanto, la memoria debe acceder en
al menos 450ns menos otra banda de
protección de 30-40ns para búferes y
decodificadores.

● Se requiere DRAM de 420ns para el 8086.


Sincronización del BUS
● LISTO:
○ Una entrada al 8086 que provoca estados de
espera para componentes de E / S y memoria
más lentos.
○ Un estado de espera(T W ) es un período de
reloj adicional insertado entre T 2 and T 3
para alargar el ciclo del bus.
■ Por ejemplo, esto extiende un ciclo
de bus de 460ns (a un reloj de
5MHz) a 660ns.

15
● El texto analiza el papel del 8284A y los requisitos
de tiempo para el 8086.
Modo MIN y MAX
● Controlado a través del pin MN / MX.
● El modo mínimo es más económico ya que todas las señales de
control para la memoria y las E / S son generadas por el
microprocesador.
● El modo máximo está diseñado para usarse cuando existe un
coprocesador (8087) en el sistema.

● Algunas de las señales de control deben generarse


externamente, debido a la redefinición de ciertos pines de
control en el 8086.
○ Los siguientes pines se pierden cuando el
8086 funciona en modo Máximo.
● ALE
● WR
● IO/ M
● DT/ R
● DEN
● INTA

● Esto requiere un controlador de bus externo: el


controlador de bus 8288.
8288 Bus Controller

16
● Se utilizan señales separadas para E / S (IORC e IOWC)
y memoria (MRDC y MWTC).
● También se proporcionan luces estroboscópicas de
escritura de memoria avanzada (AIOWC) y E / S
(AIOWC) más INTA.
Modo MAX 8086 Sistema

17
2. DECODIFICADOR DE LENGUAJE MÁQUINA DEL PROCESADOR INTEL
8088

El lenguaje ensamblador es el lenguaje de programación utilizado para escribir


programas de bajo nivel, mediante una representación de código máquina. El
código máquina se encuentra representado en forma binaria, sin embargo, la
longitud de los programas hace un tanto complicada la comprensión de cada
instrucción, es por esto, que el lenguaje ensamblador utiliza una representación
equivalente para cada instrucción.
Introducción

Formato de instrucción ‘mov’

Para poder llevar a cabo dicho programa, es necesario comprender el formato


de la instrucción ‘mov’. Tal como se muestra en [2], existen 7 tipos de
transferencia de datos, de los cuales se tomarán en cuenta los siguientes:

● Registro/memoria a/de registro


● Inmediato a registro
● Memoria a acumulador
● Acumulador a memoria

18
● Registro/memoria a registro de segmentación
● Registro de segmentación a registro/memoria

A continuación se muestra el formato para cada una de las instrucciones:

Donde:

‘W’ nos informa del tamaño de los operandos. Con W = 0 estamos accediendo a
8 bits y con W = 1 a una palabra, es decir 16 bits.

‘D’* nos informa si el registro especificado en el campo REG se trata del


operando fuente u operando destino de instrucción especificada por el código de
operación. (Para nuestro caso ‘d’ tendrá un valor de 1, y ‘mod’ de 11, por lo que
‘r/m’ será tratado como ‘reg’.)

Para D = 0, el registro indicado por el campo REG es el operando fuente y para


D = 1, el registro indicado por el campo REG es el operando destino.

‘Reg’ nos indica el registro que se utilizara, para lo cual existen las siguientes
combinaciones (tabla 1)

19
Desarrollo

Primer término: Una vez que se analiza el formato de la instrucción ‘mov’ se


puede observar que se cuenta con un patrón en los primeros cuatro bits,
teniendo este los siguientes valores:

Por lo que la primera parte del código se centra en encontrar estos valores
(Figura 1), de no encontrarse se mandará un mensaje de error. La comparación
se realiza con el valor en ASCI correspondiente a cada término.

20
Segundo término: Posteriormente se procede a hacer la comparación del
segundo término de cada instrucción Fig. 2, empezando de esta forma a separar
cada tipo de transferencia de datos.

a) Segundo término para 8, b) Segundo término para A, c) Segundo término de


B

Fig.2 Comparación del segundo término.

21
Debido a que la entrada está dada en hexadecimal y lo que el programa recibe es
su correspondiente en ASCII, es necesario hacer una conversión, así como
delimitar el rango en el cual está permitido introducir los datos, esto es, valores
de 0~9 y A~F (Fig. 3).

Fig.3 Delimitación de valores permitidos.


Registros

La selección de registros, ya sea de 8 bits o de 16 bits, se realiza por medio de


‘w’, por lo que se realiza una comparación de dicha variable (Fig. 4).

22
Siguiente instrucción

Una vez que se termina de evaluar una instrucción es necesario seguir


evaluando las consecutivas, en caso de que el carácter siguiente sea ‘*’ se da por
concluida la evaluación a la cadena introducida, de no ser así se continuara
evaluando (Fig. 5).

Fig.5 Código para seguir evaluando


Código en ensamblador

En la parte final se colocará el código empleado

Resultados

En la siguiente figura (Fig. 6) se puede observar la evaluación de la cadena


conformada por las siguientes instrucciones (tabla 2).

Fig. 6. Evaluación de cadena.

23
Conclusiones

Es necesario conocer el formato de código máquina de la instrucción para de


esta manera poder evaluar carácter a carácter la cadena introducida. De igual
manera es importante tomar en cuenta los rangos que estos caracteres pueden
tomar, es decir, deben ser solo caracteres de 0~9 y A~F, por lo que si se
introduce una instrucción incompleta o un carácter que no corresponde un
mensaje de error aparcera (Fig. 7). Otro aspecto no menos importante a
considerar es el hecho de que el código introducido esta dado en ASCII por lo
que es importante trasladar de este valor a su correspondiente hexadecimal.
Referencias

● Medina, R. (1992). Programación Avanzada en Lenguaje Ensamblador.


● Museo Informático de la Escuela de Ingeniería Informática. https://museo.inf.uva.es/?0=8088
● 8088 8-BIT HMOS MICROPROCESSOR 8088/8088-2-August 1990-
Intel-https://pdf1.alldatasheet.com/datasheet-pdf/view/66062/INTEL/8088.html

24
DECODIFICADOR DE LENGUAJE MÁQUINA DEL PROCESADOR INTEL 8088
Anexo 1. Código en ensamblador

.model small
.stack 100
.data
.386
cad db 500 DUP(?)
sds db ?
aux1 db ?
aux2 db ?
aux3 db ?
ctrl db 0
w db 0
b db 0
rs db 2
sr db 0
mac db 0
moov db 13,10,"mov ",'$'
r8al db,"AL",'$'
r8ah db,"AH",'$'
r8bl db,"BL",'$'
r8bh db,"BH",'$'
r8cl db,"CL",'$'
r8ch db,"CH",'$'
r8dl db,"DL",'$'
r8dh db,"DH",'$'

r16ax db,"AX",'$'
r16bx db,"BX",'$'
r16cx db,"CX",'$'
r16dx db,"DX",'$'
r16sp db,"SP",'$'
r16bp db,"BP",'$'
r16si db,"SI",'$'
r16di db,"DI",'$'

rses db,"ES",'$'
rscs db,"CS",'$'
rsss db,"SS",'$'
rsds db,"DS",'$'

pac db,"[",'$'
pab db,"]",'$'
coma db,",",'$'

eror db 13,10,"Instruccion erronea",'$'


inst db 13,10,"Introducir cadena: ",'$'
fiin db 13,10,"Fin",'$'
.code
mov ax,@DATA
mov ds,ax

mov ah,9
mov dx,offset inst
int 21h
inicio1:
mov ah,1
int 21h

cmp al,42
jz inicio2

mov [cad+SI],al

add SI,1

cmp SI,499
jz fin
jnz inicio1

mov ah,2
int 21h

;----inicio2 cuando el caracter introducido es *


inicio2:
mov [cad+SI],al
mov SI,0

;------empieza la comparacion
;-----comparacion del primer termino
compa:
cmp [cad+SI],42 ; * asterisco
jz error

cmp [cad+SI],38h ; 8
jz seg_ter_8

cmp [cad+SI],41H ; A
jz seg_ter_a

cmp [cad+SI],42h ; B
jz seg_ter_b

jnz error

;-----comparacion del segundo termino termino ¨8¨


seg_ter_8:
add SI,1

cmp [cad+SI],42 ; asterisco


jz error

cmp [cad+SI],41h ; A
jz ult_ter_rm_8

cmp [cad+SI],42H ; B
jz ult_ter_rm_16

cmp [cad+SI],43h ; C
jz ult_ter_segre

cmp [cad+SI],45h ; E
jz ult_ter_reseg

jnz error

ult_ter_rm_16:
mov w,1
;--------ultimos terminos para 8A
ult_ter_rm_8:

add SI,1
mov ah,[cad+SI]
add SI,1
mov al,[cad+SI]
;valor puro letras tercer termino
mov aux1,ah ;C~F
;sub aux1,37h ;letras
mov aux2,al
;empieza comparacion primer termino

cmp aux1,43h ;1er limite de letras


js error
cmp aux1,46h
jz nxt2
jns error

nxt2:
sub aux1,37h ;letras
;valor puro numeros cuarto termino
;empieza comparacion segundo termino
cmp aux2,30h
jz val_pu_num ; el valor es 0

js error ;si el valor es menor que 0


cmp aux2,39h ;cmp el segundo limite de numeros
jz val_pu_num
jns ch_letra ;mas grande que num checar si es letra
js val_pu_num
ch_letra:
cmp aux2,41h ;1er limite de letras
jz val_pur_let
js error
cmp aux2,46h
jz val_pur_let
jns error
js val_pur_let

val_pu_num:
sub al,30h
mov aux2,al
jmp nxt

val_pur_let:
sub al,37h
mov aux2,al
nxt:
;seleccionando los valores importantes
and aux1,3h
and al,8h
;corrimientos
mov cl,1
shl aux1,cl
mov cl,3
shr al,cl
add aux1,al ;primer registro
and aux2,7h ;segundo registro

;encontrar primer registro


mov ah,9
mov dx,offset moov
int 21h

cmp aux1,0
jnz uno

mov ah,9
cmp w,1
jz cero16
mov dx,offset r8al
int 21h

jmp ult_8A
cero16:
mov dx,offset r16ax
int 21h
jmp ult_8A
uno:
cmp aux1,1
jnz dos
cmp w,1
jz uno16
mov dx,offset r8cl
int 21h

jmp ult_8A
uno16:
mov dx,offset r16cx
int 21h

jmp ult_8A
dos:
cmp aux1,2
jnz tres

cmp w,1
jz dos16
mov dx,offset r8dl
int 21h

jmp ult_8A
dos16:
mov dx,offset r16dx
int 21h

jmp ult_8A
tres:
cmp aux1,3
jnz cuatro

cmp w,1
jz tres16
mov dx,offset r8bl
int 21h

jmp ult_8A
tres16:
mov dx,offset r16bx
int 21h

jmp ult_8A
cuatro:
jnz cinco

cmp w,1
jz cuatro16
mov dx,offset r8ah
int 21h

jmp ult_8A
cuatro16:
mov dx,offset r16sp
int 21h

jmp ult_8A
cinco:
cmp aux1,5
jnz seis

cmp w,1
jz cinco16
mov dx,offset r8ch
int 21h

jmp ult_8A
cinco16:
mov dx,offset r16bp
int 21h

jmp ult_8A
seis:
cmp aux1,6
jnz siete

cmp w,1
jz seis16
mov dx,offset r8dh
int 21h

jmp ult_8A
seis16:
mov dx,offset r16si
int 21h

jmp ult_8A
siete:
cmp aux1,7
jnz error

cmp w,1
jz siete16
mov dx,offset r8bh
int 21h
siete16:
mov dx,offset r16di
int 21h

ult_8A:
mov dx,offset coma
int 21h
reg_b:

mov ah,9
cmp aux2,0
jnz uno2

cmp w,1
jz cero16_2

mov dx,offset r8al


int 21h

cmp b,1
jz ult_b
cmp mac,0
jnz acume
jmp sig_lin
cero16_2:
mov dx,offset r16ax
int 21h

cmp b,1
jz ult_b
cmp rs,0
jz sego
cmp mac,0
jnz acume
jmp sig_lin
uno2:
cmp aux2,1
jnz dos2

cmp w,1
jz uno16_2
mov dx,offset r8cl
int 21h

cmp b,1
jz ult_b
jmp sig_lin
uno16_2:
mov dx,offset r16cx
int 21h

cmp b,1
jz ult_b
cmp rs,0
jz sego
jmp sig_lin

dos2:
cmp aux2,2
jnz tres2

cmp w,1
jz dos16_2
mov dx,offset r8dl
int 21h

cmp b,1
jz ult_b
jmp sig_lin

dos16_2:
mov dx,offset r16dx
int 21h

cmp b,1
jz ult_b
cmp rs,0
jz sego
jmp sig_lin

tres2:
cmp aux2,3
jnz cuatro2

cmp w,1
jz tres16_2
mov dx,offset r8bl
int 21h

cmp b,1
jz ult_b
jmp sig_lin

tres16_2:
mov dx,offset r16bx
int 21h

cmp b,1
jz ult_b
cmp rs,0
jz sego
jmp sig_lin
cuatro2:
cmp aux2,4
jnz cinco2

cmp w,1
jz cuatro16_2
mov dx,offset r8ah
int 21h

cmp b,1
jz ult_b
jmp sig_lin

cuatro16_2:
mov dx,offset r16sp
int 21h

cmp b,1
jz ult_b
cmp rs,0
jz sego
jmp sig_lin

cinco2:
cmp aux2,5
jnz seis2

cmp w,1
jz cinco16_2
mov dx,offset r8ch
int 21h

cmp b,1
jz ult_b
jmp sig_lin

cinco16_2:
mov dx,offset r16bp
int 21h

cmp b,1
jz ult_b
cmp rs,0
jz sego
jmp sig_lin

seis2:
cmp aux2,6
jnz siete2
cmp w,1
jz seis16_2
mov dx,offset r8dh
int 21h

cmp b,1
jz ult_b
jmp sig_lin

seis16_2:
mov dx,offset r16si
int 21h

cmp b,1
jz ult_b
cmp rs,0
jz sego
jmp sig_lin
siete2:
cmp aux2,7
jnz error

cmp w,1
jz siete16_2
mov dx,offset r8bh
int 21h

cmp b,1
jz ult_b
jmp sig_lin

siete16_2:
mov dx,offset r16di
int 21h

cmp b,1
jz ult_b
cmp rs,0
jz sego
jmp sig_lin

;--------Segmentacion a registro
;tercer termino de 8C
ult_ter_segre:

mov w,1
add SI,1

cmp [cad+SI],43h
jz dscero
cmp [cad+SI],44h
jz dsuno
jnz error

dscero:
mov sds,0
jmp nxto1
dsuno:
mov sds,1
nxto1:
add SI,1
cmp [cad+SI],42
jz error

cmp [cad+SI],30h
jz purnum1 ; el valor es 0

js error ;si el valor es menor que 0

cmp [cad+SI],39h ;cmp el segundo limite de numeros


jz purnum1
jns letr2 ;mas grande que num checar si es letra
js purnum1
letr2:
cmp [cad+SI],41h ;1er limite de letras
jz vallet1
js error
cmp [cad+SI],46h ;2do limite de letras
jz vallet1
jns error
js vallet1

purnum1:
mov al,[cad+SI]
sub al,30h
mov aux2,al
jmp nxto3

vallet1:
mov al,[cad+SI]
sub al,37h
mov aux2,al

nxto3:
and al,8
and aux2,7 ; registro
mov cl,3
shr al,cl
mov cl,1
shl sds,cl
add sds,al ;segmento a elegir
mov rs,0

;-----segmentacion
mov ah,9
mov dx,offset moov
int 21h

jmp reg_b
sego:

mov ah,9
mov dx,offset coma
int 21h

cmp sds,0
jnz csds1
mov ah,9
mov dx,offset rses
int 21h

jmp sig_lin
csds1:
cmp sds,1
jnz csds2

mov ah,9
mov dx,offset rscs
int 21h

jmp sig_lin
csds2:
cmp sds,2
jnz csds3
mov ah,9
mov dx,offset rsss
int 21h

jmp sig_lin
csds3:
cmp sds,3
jnz error
mov ah,9
mov dx,offset rsds
int 21h

jmp sig_lin

;--------Registro a Segmentacion
;tercer termino de 8E
ult_ter_reseg:
mov w,1
add SI,1

cmp [cad+SI],43h
jz dscero1
cmp [cad+SI],44h
jz dsuno1
jnz error

dscero1:
mov sds,0
jmp nxto4
dsuno1:
mov sds,1
nxto4:
add SI,1
cmp [cad+SI],42
jz error

cmp [cad+SI],30h
jz purnum2 ; el valor es 0

js error ;si el valor es menor que 0

cmp [cad+SI],39h ;cmp el segundo limite de numeros


jz purnum2
jns letr3 ;mas grande que num checar si es letra
js purnum2
letr3:
cmp [cad+SI],41h ;1er limite de letras
jz vallet2
js error
cmp [cad+SI],46h
jz vallet2
jns error
js vallet2

purnum2:
mov al,[cad+SI]
sub al,30h
mov aux2,al
jmp nxto5

vallet2:
mov al,[cad+SI]
sub al,37h
mov aux2,al

nxto5:
and al,8
and aux2,7 ; registro
mov cl,3
shr al,cl
mov cl,1
shl sds,cl
add sds,al ;segmento a elegir
mov rs,1

mov ah,9
mov dx,offset moov
int 21h

cmp sds,0
jnz csds_1
mov ah,9
mov dx,offset rses
int 21h

mov ah,9
mov dx,offset coma
int 21h

jmp reg_b

csds_1:
cmp sds,1
jnz csds_2

mov ah,9
mov dx,offset rscs
int 21h

mov dx,offset coma


int 21h

jmp reg_b

csds_2:
cmp sds,2
jnz csds_3
mov ah,9
mov dx,offset rsss
int 21h

mov dx,offset coma


int 21h

jmp reg_b
csds_3:
cmp sds,3
jnz error
mov ah,9
mov dx,offset rsds
int 21h

mov dx,offset coma


int 21h

jmp reg_b

;--------Segundo termino de A
seg_ter_a:

add SI,1
cmp [cad+SI],42
jz error

cmp [cad+SI],30h
jz acum_mem

cmp [cad+SI],31h
jz acum_mem

cmp [cad+SI],32h
jz mem_acum

cmp [cad+SI],33h
jz mem_acum
jnz error

;------0/1
mem_acum:
mov al,[cad+SI]
sub al,32h

cmp al,1
jz w16

mov w,0
jmp dire

w16:
mov w,1
dire:
mov ctrl,0
mov aux2,0
mov mac,0
mov ah,9
mov dx,offset moov
int 21h
acumed:
mov ah,9
mov dx,offset pac
int 21h

;---direccion baja
add SI,1
cmp [cad+SI],42
jz error

cmp [cad+SI],30h
js error ;si el valor es menor que 0

cmp [cad+SI],39h ;cmp el segundo limite de numeros


jz sav
jns lilet ;mas grande que num checar si es letra
js sav
lilet:
cmp [cad+SI],41h ;1er limite de letras
js error
cmp [cad+SI],46h ;2do limite de letras
jns error

sav:
mov bh,[cad+SI]

add SI,1
cmp [cad+SI],42
jz error

cmp [cad+SI],30h
js error ;si el valor es menor que 0

cmp [cad+SI],39h ;cmp el segundo limite de numeros


jz sav2
jns lilet2 ;mas grande que num checar si es letra
js sav2
lilet2:
cmp [cad+SI],41h ;1er limite de letras
js error
cmp [cad+SI],46h ;2do limite de letras
jns error
sav2:
mov bl,[cad+SI]

;----direccion alta
add SI,1
cmp [cad+SI],42
jz error
cmp [cad+SI],30h
js error ;si el valor es menor que 0

cmp [cad+SI],39h ;cmp el segundo limite de numeros


jz sav3
jns lilet3 ;mas grande que num checar si es letra
js sav3

lilet3:
cmp [cad+SI],41h ;1er limite de letras
js error
cmp [cad+SI],46h ;2do limite de letras
jns error

sav3:
mov al,[cad+SI]
mov aux1,al

add SI,1
cmp [cad+SI],42
jz error
cmp [cad+SI],30h
js error ;si el valor es menor que 0

cmp [cad+SI],39h ;cmp el segundo limite de numeros


jz sav4
jns lilet4 ;mas grande que num checar si es letra
js sav4
lilet4:
cmp [cad+SI],41h ;1er limite de letras
js error
cmp [cad+SI],46h ;2do limite de letras
jns error

sav4:
mov al,[cad+SI]
mov aux3,al

mov ah,2
mov al,aux1
pra:
mov dl,al
int 21h
add ctrl,1
cmp ctrl,1
jnz direba0

direal1:
mov al,aux3
jmp pra

direba0:
cmp ctrl,2
jnz direba1
mov al,bh
jmp pra

direba1:
cmp ctrl,3
jnz preg
mov al,bl
jmp pra

preg:
mov ah,9
mov dx,offset pab
int 21h

cmp mac,1
jz sig_lin

mov dx,offset coma


int 21h

jmp reg_b
;--------Inmediato a registro
;2/3
acum_mem:
mov mac,1
mov ctrl,0
mov aux2,0

mov al,[cad+SI]
sub al,30h

cmp al,1
jz w162

mov w,0
jmp w82
w162:
mov w,1
w82:
mov ah,9
mov dx,offset moov
int 21h
jmp reg_b
acume:
mov ah,9
mov dx,offset coma
int 21h

jmp acumed
;--------Inmediato a registro
;segundo termino de B
seg_ter_b:
add SI,1
cmp [cad+SI],42
jz error

cmp [cad+SI],30h
jz purnum ; el valor es 0
js error ;si el valor es menor que 0

cmp [cad+SI],39h ;cmp el segundo limite de numeros


jz purnum
jns letr ;mas grande que num checar si es letra
js purnum
letr:
cmp [cad+SI],41h ;1er limite de letras
jz vallet
js error
cmp [cad+SI],46h
jz vallet
jns error
js vallet

purnum:
mov al,[cad+SI]
sub al,30h
mov aux2,al
jmp nxto

vallet:
mov al,[cad+SI]
sub al,37h
mov aux2,al

nxto:
and al,8
and aux2,7 ; registro
mov cl,3
shr al,cl
mov w,al
mov b,1
;tercer termino de B
add SI,1
cmp [cad+SI],42
jz error
;----------------------------
lim:
cmp [cad+SI],30h
js error ;si el valor es menor que 0

cmp [cad+SI],39h ;cmp el segundo limite de numeros


jz mover
jns ch_letra1 ;mas grande que num checar si es letra
js mover
ch_letra1:
cmp [cad+SI],41h ;1er limite de letras
jz mover
js error
cmp [cad+SI],46h
jz mover
jns error
js mover

mover:
cmp ctrl,0
jnz b16

b8:
mov al,[cad+SI]
mov aux3,al
add ctrl,1
jmp b82
b16:
mov bh,[cad+SI]
add ctrl,1

b82:
add SI,1
cmp [cad+SI],30h
jz mover1 ; el valor es 0
js error ;si el valor es menor que 0

cmp [cad+SI],39h ;cmp el segundo limite de numeros


jz mover1
jns ch_letra2 ;mas grande que num checar si es letra
js mover1
ch_letra2:
cmp [cad+SI],41h ;1er limite de letras
jz mover1
js error
cmp [cad+SI],46h
jz mover1
jns error
js mover1
mover1:
cmp ctrl,3
jz b163
mov al,[cad+SI]
mov aux1,al
jmp a42

b163:
mov bl,[cad+SI]
jmp pr
a42:
cmp w,1
jnz pr

add SI,1
add ctrl,1
jmp lim

pr:
mov ah,9
mov dx,offset moov
int 21h

jmp reg_b

ult_b:
mov ah,9
mov dx,offset coma
int 21h

cmp ctrl,1
jnz pr8
baj:
mov ah,2
mov dl,aux3
int 21h

mov ah,2
mov dl,aux1
int 21h

jmp sig_lin

pr8:
mov ah,2
mov dl,bh
int 21h
mov ah,2
mov dl,bl
int 21h
jmp baj
;--------siguiente instruccion
sig_lin:
add SI,1

cmp [cad+SI],42
jz fin

mov w,0
mov b,0
mov ctrl,0
mov rs,2
mov mac,0
jnz compa

;--------fin de programa
error:

mov ah,9
mov dx,offset eror
int 21h
jmp fin

fin:
mov ah,9
mov dx,offset fiin
int 21h

mov ah,4ch
int 21h
end

También podría gustarte