Está en la página 1de 28

UNIVERSIDAD AUTÓNOMA METROPOLITANA

UNIDAD: AZCAPOTZALCO

UEA: LABORATORIO DE MICROPROCESADORES

PRACTICA 4: INICIO DE LA MULTITAREA

NOMBRE: CORTES SORIANO GERMAN

TRIMESTRE: 21- P

MATRICULA: 2192003288

GRUPO: CEL 81

CATEDRÁTICO: ING. HÉCTOR BOLÍVAR OLMOS RAMÍREZ


OBJETIVOS

• Analizar el código de la practica 4.


• Conocer los comandos para la ejecución en la terminal.
• Hacer una ejecución del programa a través de la terminal, ya no en el
programa
DESARROLLO DE LA PRACTICA
Durante esta práctica se realizó una modificación ya que primeramente se realizo
el programa en el block de notas (figura 2) y una vez terminado de hacer el
programa entonces se abrió el programa en Doxbox en el cual se tendría que
compilarlo pero aquí hubo una diferencia de compilación, esto quiere decir que en
la compilación se tendría que hacer por medio de Code view y las instrucciones para
que apareciera estarían en la figura 1 , cabe señalar que en esta ocasión se tendría
que declarar a la carpeta MASM y encontrarlo con la subcarpeta MSM611 y la
subcarpeta de Bin.

Figura 1. Instrucciones puestas en Dosbox al entrar


Figura 2. Programa en el block de notas

Figura 3. muestreo del programa en .ASM

En la figura 3 se puede observar el programa CONCUR01.ASM ,en seguida se


volvió a las instrucciones de Dosbox para para que ahora apareciera los mensajes
que se mostraran así la pantalla que se visualiza en code view y por ello en la figura
3.1 se observara las instrucciones que se agregaron y en la figura 3.2 se observara
las salidas que recibirá es decir que se visualizara los mensajes

Figura 3.1. continuación de Instrucciones puestas en Dosbox para entrar a .EXE

En la parte donde se quedó de las instrucciones “C:\MASM\MASM611\BIN> “


después de la flecha seguirá la palabra CLS y por último se tendrá que teclear el
mensaje de CV CONCUR01.EXE para que aparezca la pantalla de code view como
se mostrará en la figura 5.
Figura 3,2 Mensajes que aparecen en el programa CONCUR01

Ahora de la misma forma pero de diferente versión se regresara al programa


DoxBox para empezar a ejecutarlo y por ello se agregaron las instrucciones que
aparecerán en la figura 4 y posteriormente se mostrara la pantalla de code view
para empezar a ejecutar el programa (figura 5)
Al tener listo la pantalla entonces se empezara a leer carácter por carácter para ver
que esta haciendo el programa y entonces cuando se muestra el primer mensaje al
momento de darle enter entonces sale el mensaje diciendo soy Corrutina 1 : primera
vez ==> Soy corruptina Z: Primera vez , posteriormente se vuelve a seguir leyendo
carácter por carácter hasta llegar el segundo mensaje de Corrutina 2 y finalmente
al detectar el mensaje 3 y presionar enter se visualiza el tercer mensaje de Corrutina
3. Y una vez acabo entonces se sale de la pantalla por lo que se llegaría a observar
que en el programa aparecen 3 mensajes diciendo lo mismo pero con números
diferentes, en la figura 6 se podrá apreciar a los 3 mensajes que manda el programa
al finalizarlo.
Figura 4. Instrucciones puestas para ingresar al code view

Usando el comando “cv CONCUR01.EXE” nos sale el CODE VIEW (Figura 4) ,


ahora como se puede observar se logró realizar la ejecución de la practica 4 sin
tener que usar el programa
En este caso si presionemos F8 = trace nos deja avanzar paso a paso el programa.
Como se menciona, se puede hacer un recorrido en el programa paso por paso de
manera que logremos apreciar como funciona esa parte del código. A continuación,
con el comando cv progra3.exe comenzamos el análisis del programa. Podemos
visualizar los registros y los datos de memoria. Para finalizar la practica mediante la
tecla Fn+F8 vamos analizando como los registros y para ser especifico Ax va
cambiando en medida que se va copiando la cadena, letra por letra.
Recordemos que:
• Registro AX: El registro AX es el registro acumulador, es utilizado para
operaciones que implican entrada/salida, multiplicación y división (estas dos últimas
en conjunto con el registro DX) • Registro BX: El registro BX es el registro base, y
es el único registro de propósito general que puede ser un índice para
direccionamiento indexado
• Registro CX: El registro CX es conocido como el registro contador. Puede contener
un valor para controlar el número de veces que un ciclo se repite o un valor para
corrimiento de bits
• Registro DX: El registro DX es el registro de datos. En algunas operaciones se
indica mediante este registro el número de puerto de entrada/salida, y en las
operaciones de multiplicación y división de 16 bits se utiliza junto con el acumulador
AX Registros Índice Los registros SI y DI están disponibles para direccionamiento
indexado y para operaciones de cadenas de caracteres.
• Registro SI: El registro índice fuente de 16 bits es requerida por algunas
operaciones con cadenas de caracteres. El SI está asociado con el segmento DS.
• Registro DI: El registro índice destino también es requerido por algunas
operaciones con cadenas de caracteres. El DI está asociado con el segmento ES.
Registros Apuntadores Los registros SP (apuntador de pila) y BP (apuntador base)
están asociados con el registro SS y permiten al sistema acceder a datos en el
segmento de la pila.
• Registro SP: El apuntador de pila de 16 bits está asociado con el segmento SS y
proporciona un valor de desplazamiento que se refiere a la palabra actual que está
siendo procesada en la pila. El sistema maneja de manera automática este registro,
aunque el programa puede hacer ciertas manipulaciones con él.
• Registro BP: El apuntador base de 16 bits facilita la referencia de parámetros
dentro de la pila.

Figura 5. muestreo del programa en code view

Al momento de leer carácter por carácter entonces se ira viendo el numero


hexadecimal en la parte derecha y al momento de encontrar un mensaje entonces
se apretará F8 y es ahí donde aparecerán los mensajes que se visualizara en la
salida de la pantalla, es decir que se irá mostrando uno por uno al momento de
apretar la tecla F8 y una vez terminado de hacerlo entonces el programa habría
finalizado correctamente, a continuación se mostrara el primer mensaje en code
view y al momento de terminarlo se asignara el primer mensaje en la salida de
pantalla (figura 6)
Figura 6 Primer mensaje al encontrarse con ret

De la misma forma se realizara el segundo mensaje , es por ello que al momento


de bajarle y encontrar con otro ciclo y apretando la tecla aparecerá el menaje (figura
6.2)
Figura 6.2 Segundo mensaje al encontrarse con el despliegue y return
Por último, en la figura 6.3 aparecerá el ultimo mensaje y es por ello que bajo el
código el code view para ver que más había y se encontró con el ultimo ret el cual
al momento de oprimir el mensaje F8 entonces aparcería el ultimo mensaje.

Figura 6.3 Ultimo mensaje al encontrarse con el despliegue y return


Ahora para guardarse con .LST entonces se observaran las figuras 7 y 7.1 en el cual para
que su ejecución sea efectiva se ira en la parte de de run y se buscara en la palabra
setpathnames y en la segunda casilla al final se teclea /la y entonces de la misma forma
que en el anterior procedimiento se corre el programa y se presentara la pantalla, pero
ahora esa pantalla azul da los valores en binario como se mostrara a continuación

Figura 7. Agregación de /la en la segunda casilla después de zi

Figura 7.1 Implementacion del programa en .LST


Figura 4.2 ejecución del programa en .LST

LISTADO DE PROGRAMA EN .ASM


;Programa CONCUR01
;Intercambio del Control entre dos Corrutinas
;por medio de llamadas a Procedimientos.

Fin_Mem EQU "$"


NUEVE EQU 9
CR EQU 13
LF EQU 10

STACK_SEG SEGMENT 'STACK'

Pila01 DW 20 DUP(0)
Tope01 EQU THIS WORD

Pila02 DW 20 DUP(0)
Tope02 EQU THIS WORD
PilaFin DW 20 DUP(0)
TopeFin EQU THIS WORD

STACK_SEG ENDS

DATA_SEG SEGMENT 'DATA'

Almace01 DW 00
Almace02 DW 02
AlmacFin DW 04

Men11 DB CR
DB LF
DB LF
DB LF
DB " <<< Soy Corrutina 1 : Primera Vez. ==> "
DB Fin_Mem

Men12 DB " <<< Soy Corrutina 1 : Segunda Vez. ==> "


DB Fin_Mem

Men13 DB " <<< Soy Corrutina 1 : Tercera Vez. ==> "


DB Fin_Mem

Men21 DB " Soy Corrutina 2 : Primera Vez. >>> "


DB CR
DB LF
DB LF
DB LF
DB Fin_Mem

Men22 DB " Soy Corrutina 2 : Segunda Vez. >>> "


DB CR
DB LF
DB LF
DB LF
DB Fin_Mem

Men23 DB " Soy Corrutina 2 : Tercera Vez. >>> "


DB CR
DB LF
DB LF
DB LF
DB Fin_Mem

DATA_SEG ENDS

CODE_SEG SEGMENT 'CODE'

ASSUME CS:CODE_SEG, DS:DATA_SEG,


SS:STACK_SEG

MAIN PROC FAR

MOV SP, OFFSET TopeFin


MOV AX, DATA_SEG
MOV DS, AX
MOV AX, STACK_SEG
MOV SS, AX

CALL PREPARA
CALL INICIA01
MOV AH, 4CH
INT 21H

MAIN ENDP

PREPARA PROC NEAR

MOV BX, OFFSET TopeFin


MOV [AlmacFin], BX
MOV BP, OFFSET Tope01
MOV BX, OFFSET CORRUT01
MOV [BP], BX
MOV [Almace01],BP
MOV BP, OFFSET Tope02
MOV BX, OFFSET CORRUT02
MOV [BP],BX
MOV [Almace02], BP
RET

PREPARA ENDP

INICIA01 PROC NEAR

MOV [AlmacFin], SP
MOV SP, [Almace01]
RET

INICIA01 ENDP

TERMINA PROC NEAR

MOV [Almace02], SP
MOV SP, [AlmacFin]
RET

TERMINA ENDP

CORRUT01 PROC NEAR

MOV DX, OFFSET MEN11


CALL DESPLI
CALL TRANS02
MOV DX, OFFSET MEN12
CALL DESPLI
CALL TRANS02
MOV DX, OFFSET MEN13
CALL DESPLI
CALL TRANS02

CORRUT01 ENDP

CORRUT02 PROC NEAR

MOV DX, OFFSET MEN21


CALL DESPLI
CALL TRANS01
MOV DX, OFFSET MEN22
CALL DESPLI
CALL TRANS01
MOV DX, OFFSET MEN23
CALL DESPLI
CALL TERMINA

CORRUT02 ENDP

TRANS01 PROC NEAR

MOV [Almace02], SP
MOV SP, [Almace01]
RET

TRANS01 ENDP

TRANS02 PROC NEAR

MOV [Almace01], SP
MOV SP, [Almace02]
RET

TRANS02 ENDP

DESPLI PROC NEAR


MOV AH, NUEVE
INT 21H
RET

DESPLI ENDP

CODE_SEG ENDS

END MAIN

CODIGO DE PROGRAMA EN .LST


Microsoft (R) Macro Assembler Version 6.11 10/15/21
11:44:59
C:\IRVINE\CONCUR01.asm Page 1 - 1

;Programa CONCUR01
;Intercambio del Control entre
dos Corrutinas
;por medio de llamadas a
Procedimientos.

= 0024 Fin_Mem EQU "$"


= 0009 NUEVE EQU 9
= 000D CR EQU 13
= 000A LF EQU 10

0000 STACK_SEG SEGMENT


'STACK'
0000 0014 [ Pila01 DW 20 DUP(0)
0000
]
0028 = 0028 Tope01 EQU THIS
WORD

0028 0014 [ Pila02 DW 20 DUP(0)


0000
]
0050 = 0050 Tope02 EQU THIS
WORD

0050 0014 [ PilaFin DW 20 DUP(0)


0000
]
0078 = 0078 TopeFin EQU THIS
WORD

0078 STACK_SEG ENDS

0000 DATA_SEG SEGMENT


'DATA'

0000 0000 Almace01 DW 00


0002 0002 Almace02 DW 02
0004 0004 AlmacFin DW 04

0006 0D Men11 DB CR
0007 0A DB LF
0008 0A DB LF
0009 0A DB LF
000A 20 20 3C 3C 3C 20 DB " <<< Soy Corrutina
1 : Primera Vez. ==> "
53 6F 79 20 43 6F
72 72 75 74 69 6E
61 20 31 20 3A 20
50 72 69 6D 65 72
61 20 56 65 7A 2E
20 3D 3D 3E 20
0033 24 DB Fin_Mem

0034 20 20 3C 3C 3C 20 Men12 DB " <<< Soy


Corrutina 1 : Segunda Vez. ==> "
53 6F 79 20 43 6F
72 72 75 74 69 6E
61 20 31 20 3A 20
53 65 67 75 6E 64
61 20 56 65 7A 2E
20 3D 3D 3E 20
005D 24 DB Fin_Mem
005E 20 20 3C 3C 3C 20 Men13 DB " <<< Soy
Corrutina 1 : Tercera Vez. ==> "
53 6F 79 20 43 6F
72 72 75 74 69 6E
61 20 31 20 3A 20
54 65 72 63 65 72
61 20 56 65 7A 2E
20 3D 3D 3E 20
0087 24 DB Fin_Mem

0088 20 53 6F 79 20 43 Men21 DB " Soy


Corrutina 2 : Primera Vez. >>> "
6F 72 72 75 74 69
6E 61 20 32 20 3A
20 50 72 69 6D 65
72 61 20 56 65 7A
2E 20 3E 3E 3E 20
00AC 0D DB CR
00AD 0A DB LF
00AE 0A DB LF
00AF 0A DB LF
00B0 24 DB Fin_Mem

00B1 20 53 6F 79 20 43 Men22 DB " Soy


Corrutina 2 : Segunda Vez. >>> "
6F 72 72 75 74 69
6E 61 20 32 20 3A
20 53 65 67 75 6E
64 61 20 56 65 7A
2E 20 3E 3E 3E 20
00D5 0D DB CR
00D6 0A DB LF
00D7 0A DB LF
00D8 0A DB LF
00D9 24 DB Fin_Mem

00DA 20 53 6F 79 20 43 Men23 DB " Soy


Corrutina 2 : Tercera Vez. >>> "
6F 72 72 75 74 69
6E 61 20 32 20 3A
20 54 65 72 63 65
72 61 20 56 65 7A
2E 20 3E 3E 3E 20
00FE 0D DB CR
00FF 0A DB LF
0100 0A DB LF
0101 0A DB LF
0102 24 DB Fin_Mem

0103 DATA_SEG ENDS


0000 CODE_SEG SEGMENT
'CODE'

ASSUME CS:CODE_SEG,
DS:DATA_SEG, SS:STACK_SEG

0000 MAIN PROC FAR

0000 BC 0078 R MOV SP, OFFSET


TopeFin
0003 B8 ---- R MOV AX, DATA_SEG
0006 8E D8 MOV DS, AX
0008 B8 ---- R MOV AX, STACK_SEG
000B 8E D0 MOV SS, AX

000D E8 0007 CALL PREPARA


0010 E8 0026 CALL INICIA01
0013 B4 4C MOV AH, 4CH
0015 CD 21 INT 21H

0017 MAIN ENDP

0017 PREPARA PROC NEAR

0017 BB 0078 R MOV BX, OFFSET


TopeFin
001A 89 1E 0004 R MOV [AlmacFin],
BX
001E BD 0028 R MOV BP, OFFSET
Tope01
0021 BB 004B R MOV BX, OFFSET
CORRUT01
0024 89 5E 00 MOV [BP], BX
0027 89 2E 0000 R MOV
[Almace01],BP
002B BD 0050 R MOV BP, OFFSET
Tope02
002E BB 0066 R MOV BX, OFFSET
CORRUT02
0031 89 5E 00 MOV [BP],BX
0034 89 2E 0002 R MOV [Almace02],
BP
0038 C3 RET

0039 PREPARA ENDP

0039 INICIA01 PROC NEAR

0039 89 26 0004 R MOV [AlmacFin],


SP
003D 8B 26 0000 R MOV SP,
[Almace01]
0041 C3 RET
0042 INICIA01 ENDP

0042 TERMINA PROC NEAR

0042 89 26 0002 R MOV [Almace02],


SP
0046 8B 26 0004 R MOV SP,
[AlmacFin]
004A C3 RET

004B TERMINA ENDP

004B CORRUT01 PROC NEAR

004B BA 0006 R MOV DX, OFFSET


MEN11
004E E8 0042 CALL DESPLI
0051 E8 0036 CALL TRANS02
0054 BA 0034 R MOV DX, OFFSET
MEN12
0057 E8 0039 CALL DESPLI
005A E8 002D CALL TRANS02
005D BA 005E R MOV DX, OFFSET
MEN13
0060 E8 0030 CALL DESPLI
0063 E8 0024 CALL TRANS02
0066 CORRUT01 ENDP

0066 CORRUT02 PROC NEAR

0066 BA 0088 R MOV DX, OFFSET


MEN21
0069 E8 0027 CALL DESPLI
006C E8 0012 CALL TRANS01
006F BA 00B1 R MOV DX, OFFSET
MEN22
0072 E8 001E CALL DESPLI
0075 E8 0009 CALL TRANS01
0078 BA 00DA R MOV DX, OFFSET
MEN23
007B E8 0015 CALL DESPLI
007E E8 FFC1 CALL TERMINA

0081 CORRUT02 ENDP

0081 TRANS01 PROC NEAR

0081 89 26 0002 R MOV [Almace02],


SP
0085 8B 26 0000 R MOV SP,
[Almace01]
0089 C3 RET
008A TRANS01 ENDP

008A TRANS02 PROC NEAR

008A 89 26 0000 R MOV [Almace01],


SP
008E 8B 26 0002 R MOV SP,
[Almace02]
0092 C3 RET

0093 TRANS02 ENDP

0093 DESPLI PROC NEAR


0093 B4 09 MOV AH, NUEVE
0095 CD 21 INT 21H
0097 C3 RET

0098 DESPLI ENDP

0098 CODE_SEG ENDS

END MAIN
Microsoft (R) Macro Assembler Version 6.11 10/15/21
11:44:59
C:\IRVINE\CONCUR01.asm Symbols 2 - 1

Segments and Groups:

Name Size Length Align Combine Class

CODE_SEG . . . . . . . . . . . . 16 Bit 0098 Para Private


'CODE'
DATA_SEG . . . . . . . . . . . . 16 Bit 0103 Para Private
'DATA'
STACK_SEG . . . . . . . . . . . 16 Bit 0078 Para Private
'STACK'

Procedures, parameters and locals:

Name Type Value Attr

CORRUT01 . . . . . . . . . . . . P Near 004B CODE_SEG


Length= 001B Private
CORRUT02 . . . . . . . . . . . . P Near 0066 CODE_SEG Length=
001B Private
DESPLI . . . . . . . . . . . . . P Near 0093 CODE_SEG Length=
0005 Private
INICIA01 . . . . . . . . . . . . P Near 0039 CODE_SEG Length=
0009 Private
MAIN . . . . . . . . . . . . . . P Far 0000 CODE_SEG Length= 0017
Private
PREPARA . . . . . . . . . . . . P Near 0017 CODE_SEG Length=
0022 Private
TERMINA . . . . . . . . . . . . P Near 0042 CODE_SEG Length=
0009 Private
TRANS01 . . . . . . . . . . . . P Near 0081 CODE_SEG Length=
0009 Private
TRANS02 . . . . . . . . . . . . P Near 008A CODE_SEG
Length= 0009 Private

Symbols:

Name Type Value Attr

AlmacFin . . . . . . . . . . . . Word 0004 DATA_SEG


Almace01 . . . . . . . . . . . . Word 0000 DATA_SEG
Almace02 . . . . . . . . . . . . Word 0002 DATA_SEG
CR . . . . . . . . . . . . . . . Number 000Dh
Fin_Mem . . . . . . . . . . . . Number 0024h
LF . . . . . . . . . . . . . . . Number 000Ah
Men11 . . . . . . . . . . . . . Byte 0006 DATA_SEG
Men12 . . . . . . . . . . . . . Byte 0034 DATA_SEG
Men13 . . . . . . . . . . . . . Byte 005E DATA_SEG
Men21 . . . . . . . . . . . . . Byte 0088 DATA_SEG
Men22 . . . . . . . . . . . . . Byte 00B1 DATA_SEG
Men23 . . . . . . . . . . . . . Byte 00DA DATA_SEG
NUEVE . . . . . . . . . . . . . Number 0009h
Pila01 . . . . . . . . . . . . . Word 0000 STACK_SEG
Pila02 . . . . . . . . . . . . . Word 0028 STACK_SEG
PilaFin . . . . . . . . . . . . Word 0050 STACK_SEG
Tope01 . . . . . . . . . . . . . Number 0028h
Tope02 . . . . . . . . . . . . . Number 0050h
TopeFin . . . . . . . . . . . . Number 0078h

0 Warnings
0 Errors

Conclusiones
Durante esta práctica se aprendió a correr el programa con code view
en el cual se puede observar que al correrlo nos marca carácter por
carácter y se puede observar que en el programa que se realizó al
encontrar un mensaje lo muestra y al encontrar otro también lo muestra
y así sucesivamente, en esta practica también se pudo cumplir los
objetos ya que el programa se realizo en lenguaje ensamblador
iniciando el programa con el block de notas y luego correrlo en el
programa MASM

También podría gustarte