Sie sind auf Seite 1von 19

Ejemplo 1

; UNIVERSIDAD DE COSTA RICA - SEDE GUANACASTE


; IF-4000 ARQUITECTURA DE COMPUTADORES
; EJEMPLO-01 Registros, Variables y Operaciones Aritméticas Básicas.
; FECHA: 29/10/2015.

INCLUDE c:\Irvine\Irvine32.inc
INCLUDELIB c:\Irvine\Irvine32.lib

.listall

.data ;Directiva de Inicio de Variables.


Num1 sdword ?
Num2 sdword ?
Suma sdword 0
Prod sdword 0

.code ;Directiva de Inicio de Código.

main PROC ;Inicio Procedimiento Main

; Cargar los Valores de NUM1 y NUM2 ****************

mov Num1,335 ;Num1 = 335.


mov Num2,579 ;Num2 = 579.

; Suma = Num1 + Num2 *******************************

mov eax,Num1 ;EAX = Num1 = 335.


add eax,Num2 ;EAX = EAX + Num2.
mov Suma,eax ;Suma = EAX.

; Prod = Num1 * Num2 *******************************

mov eax,Num1 ;EAX = Num1.


imul Num2 ;(EDX:EAX) = EAX*Num2.
mov Prod,eax ;Prod = EAX. (32 bits).

exit ;Sale del Procedimiento.

main ENDP ;Final del Proceso MAIN.


END main ;Final del Programa
Ejemplo 2
; UNIVERSIDAD DE COSTA RICA - SEDE GUANACASTE
; IF-4000 ARQUITECTURA DE COMPUTADORES
; EJEMPLO 02: Entrada / Salida con Funciones de la Librería Irvine32
; FECHA: 29/10/2015

INCLUDE c:\Irvine\Irvine32.inc
INCLUDELIB c:\Irvine\Irvine32.lib

.listall

.data ;Directiva de Inicio de Variables.

Msg1 byte "Digite un Numero : ",0


Msg2 byte "El Numero Ingresado es : ",0
Msg3 byte "El Cuadrado del Numero es : ",0

Num sdword 0 ;Número Ingresado por Usuario.


Pot sdword 0 ;Cuadrado del Número Ingresado.

.code

main PROC

mov edx, OFFSET Msg1 ;Se pasa a EDX dirección de inicio de Msg1.
call WriteString ;Escribe mensaje en consola.

call ReadDec ;Lee un número decimal del teclado.


mov Num, eax ;Pasa número leído a variable Num.

call Crlf ;Pasa cursor a siguiente línea.


mov edx, OFFSET Msg2 ;Se pasa a EDX dirección de inicio de Msg2.
call WriteString ;Escribe mansaje en consola.
call WriteDec ;Escribe contenido de EAX (NUM) en consola.

imul Num ;EAX = EAX*NUM = NUM*NUM.


mov Pot, eax ;Envia resultado a la variable Pot.

call Crlf ;Pasa cursor a siguiente línea.


mov edx, OFFSET Msg3 ;Se pasa a EDX dirección de inicio de Msg2.
call WriteString ;Escribe mansaje en consola.
call WriteDec ;Escribe contenido de EAX (POT) en consola.
call Crlf ;Pasa cursor a siguiente línea.

exit

main ENDP

END main
Ejemplo 3

; UNIVERSIDAD DE COSTA RICA - SEDE GUANACASTE


; IF-4000 ARQUITECTURA DE COMPUTADORES
; EJEMPLO: Dado de 6 Dígitos.
; FECHA: 29/10/2015

INCLUDE c:\Irvine\Irvine32.inc
INCLUDELIB c:\Irvine\Irvine32.lib

.listall

.data ;Directiva de Inicio de Variables.

Msg1 byte "DADO EN ENSAMBLADOR : ",0


Msg2 byte "Numero : ",0
Msg3 byte "Tirar otra Vez (Y/N)? : ",0

Num sdword 0 ; Número Aleatorio.

.code

;***********************************************************************
; Función MAIN
;***********************************************************************

main PROC

; Inicializa Generador Aleatorio ***************************************

call Randomize

; Despliega Mensaje de Inicial *****************************************

Inicio: mov edx, OFFSET Msg1 ; EDX apunta a inicio de Msg1.


call WriteString
call Crlf
call CrlF

; Proceso de Tirar el Dado *********************************************

Dado: mov edx, OFFSET Msg2 ; Escribe Número.


call WriteString

call RanPro ; Genera Número Aleatorio en Tema


mov eax,Num
call WriteDec
call Crlf
call Crlf

mov edx, OFFSET Msg3 ; Despliega Mensaje de Continuar.


call WriteString

call ReadChar ; Revisa si Continúa.


cmp al,'y'
jne Final
call Clrscr
jmp Inicio
Final: exit

main ENDP

;***********************************************************************
; Cálculo del Número Aleatorio entre 1 y 6
;***********************************************************************

RanPro PROC

mov eax,6 ; Rango Aleatorio de 0 a 5.


call RandomRange
inc eax ; Pasa Rango Aleatorio de 1 a 6.
cmp eax,Num ; Compara si Número no igual a anterior.
je RanPro
mov Num,eax

RET

RanPro ENDP

;***********************************************************************

END
Ejemplo 4

; UNIVERSIDAD DE COSTA RICA - SEDE GUANACASTE


; IF-4000 ARQUITECTURA DE COMPUTADORES
; EJEMPLO 04: Ciclos Repetitivos (Cálculo de N!).
; FECHA: 03/11/2015

INCLUDE c:\Irvine\Irvine32.inc
INCLUDELIB c:\Irvine\Irvine32.lib

.listall

.data ;Directiva de Inicio de Variables.

Msg1 byte "FACTORIAL DE UN NUMERO",0


Msg2 byte "Inserte un Numero N : ",0
Msg3 byte "Resultado ---> ",0
Msg4 byte "! = ",0
Msg5 byte "OVERFLOW - Numero muy grande",0

Num sdword 0 ;Número.


Con sdword 2 ;Contador.
Fac sdword 0 ;Factorial de Número.

.code

main PROC

mov edx, OFFSET Msg1 ;Muestra Pantalla Inicial.


call WriteString
call Crlf
call Crlf

mov edx, OFFSET Msg2 ;Lectura de N (Num).


call WriteString
call ReadDec
call Crlf
mov Num,eax
cmp eax,1
jne Ciclo
mov Fac,eax
jmp Resul

Ciclo: mov ebx,Con ;Inicia el Cálculo del Factorial.


mov eax,1
Repet: imul ebx
jo Error ;Si hay overflow, salta a Error.
cmp ebx,Num ;Revisa si Con = Num.
je Resul
inc ebx ;Incrementa Contador.
jmp Repet ;Siguiente repetición.

Error: mov edx, OFFSET Msg5 ;Mensaje de Error.


call WriteString
jmp Salida

Resul: mov Fac, eax ;Guarda Factorial.


mov edx, OFFSET Msg3 ;Pantalla de Resultado.
call WriteString
mov eax,Num
call WriteDec
mov edx, OFFSET Msg4
call WriteString
mov eax,Fac
call WriteDec

Salida: call Crlf


call Crlf

exit

main ENDP

END main
Ejemplo 5

; UNIVERSIDAD DE COSTA RICA - SEDE GUANACASTE


; IF-4000 ARQUITECTURA DE COMPUTADORES
; EJEMPLO 05: Manejo de Procedimientos.
; FECHA: 17/11/2015

INCLUDE c:\Irvine\Irvine32.inc
INCLUDELIB c:\Irvine\Irvine32.lib

.listall

.data ;Directiva de Inicio de Variables.

Ball byte '0'


Col byte 0 ;Columna.
Fil byte 10 ;Fila,
Maxc byte 0 ;Columna Máxima.
Maxf byte 0 ;Fila Máxima.
Dcol byte 0 ;Dirección Columna.
Dfil byte 0 ;Dirección Fila.

.code

;*************************************************************************************************
; FUNCIÓN MAIN *
;*************************************************************************************************

main PROC

call GetMaxXY ;Toma el Tamaño Actual de la Ventana de Consola.


mov Maxf,al
mov Maxc,dl
mov Maxf,24
dec Maxc

Ciclo: call Clrscr ;Limpia la Pantalla.


call Wball
mov eax,100 ;Espera de 100 ms (0.1 s).
call Delay

Ccol: mov al,Dcol


cmp al,0
jne Cup

Cdown: mov al,Col ;Columna se Incrementa


cmp al,Maxc
jnl CDcol1
inc Col
jmp Cfil

Cup: mov al,Col


cmp al,0
jng CDcol2
dec Col
jmp Cfil

CDcol1: mov Dcol,1 ;Cambia Dirección de Movimiento


jmp Cfil

CDcol2: mov Dcol,0 ;Vuelve cursor a inicio de fila.


jmp Cfil

Cfil: mov al,Dfil


cmp al,0
jne Fup

Fdown: mov al,Fil ;Columna se Incrementa


cmp al,Maxf
jnl CDfil1
inc Fil
jmp Ciclo

Fup: mov al,Fil


cmp al,0
jng CDfil2
dec Fil
jmp Ciclo

CDfil1: mov Dfil,1 ;Cambia Dirección de Movimiento


jmp Ciclo

CDfil2: mov Dfil,0 ;Vuelve cursor a inicio de fila.


jmp Ciclo

main ENDP

;*************************************************************************************************
; PROCEDIMIENTO WBALL - Escribe 0 en ventana de Consola *
;*************************************************************************************************

Wball PROC ;Procedimiento que escribe 0 en posición apuntada por Fila y Columna.

mov dh,Fil ;Se pasa la Fila.


mov dl,Col ;Se pasa la Columna.
call Gotoxy ;Posiciona Cursor en (Fil,Col).
mov al,Ball ;Escribe un '0'.
call WriteChar

RET ;Retorno de Procedimiento.

Wball ENDP

END
Ejemplo 6
; UNIVERSIDAD DE COSTA RICA - SEDE GUANACASTE
; IF-4000 ARQUITECTURA DE COMPUTADORES
; EJEMPLO 05: Manejo de Arreglos con Registros Índice (ESI y EDI).
; FECHA: 17/11/2015

INCLUDE c:\Irvine\Irvine32.inc
INCLUDELIB c:\Irvine\Irvine32.lib

.listall

.data ;Directiva de Inicio de Variables.

Msg1 byte "Inserte un Numero : ",0


Msg2 byte "Arreglo 1 --> ",0
Msg3 byte "Suma de Elementos ---> ",0

Arr1 sdword 10 dup(2) ;Arreglo 1 inicializado en 2 (todas sus celdas).


Cont dword ? ;Contador.
Suma sdword 0 ;Suma de todos los elementos del vector.

.code

;*************************************************************************************************
; FUNCIÓN MAIN *
;*************************************************************************************************

main PROC

mov edi, OFFSET Arr1 ;Inicializa Puntero EDI a Arr1 (Arreglo 1).
mov eax, lengthof Arr1 ;Inicializa Contador de Elementos.
mov Cont, eax

CWrite: mov edx, OFFSET Msg1 ;Muestra Mensaje para insertar dato.
call WriteString
call ReadDec ;Se lee un número del teclado.
mov [edi],eax ;Se pasa EAX a la posición de Arr1 apuntada por EDI.
dec Cont ;Revisa si ya se leyó todo el arreglo.
jz Listo
add edi,4 ;EDI apunta a siguiente dato (32 bits = 4 bytes).
jmp CWrite

Listo: call Crlf ;Salto a siguiente línea.


mov edx, OFFSET Msg2 ;Muestra Mensaje para mostrar arreglo.
call WriteString
mov esi, OFFSET Arr1 ;Inicializa Puntero ESI a Arr1 (Arreglo 1).
mov eax, lengthof Arr1 ;Inicializa Contador de Elementos.
mov Cont, eax

CRead: mov eax, [esi] ;Carga en EAX el dato apuntado por ESI.
call WriteDec
add eax,Suma ;Suma elementos de Arr1.
mov Suma,eax
dec Cont ;Revisa si ya se escribió todo el arreglo.
jz Final
add esi,4 ;ESI apunta a siguiente dato (32 bits = 4 bytes).
mov al,',' ;Carga y escribe una coma en Consola.
call WriteChar
jmp CRead

Final: call Crlf ;Salto a siguiente línea.


call Crlf ;Salto a siguiente línea.
mov edx, OFFSET Msg3
call WriteString
mov eax,Suma
call WriteDec
call Crlf
call Crlf
call WaitMsg

exit

main ENDP

END
Ejemplo 7

; UNIVERSIDAD DE COSTA RICA - SEDE GUANACASTE


; IF-4000 ARQUITECTURA DE COMPUTADORES
; EJEMPLO 07: Muestreo de Teclas con MASM y Librería Irvine32.
; FECHA: 17/11/2015

INCLUDE c:\Irvine\Irvine32.inc
INCLUDELIB c:\Irvine\Irvine32.lib

.listall

.data ;Directiva de Inicio de Variables.

Msg1 byte "MUESTREO DE TECLAS",0


Msg2 byte "Acaba de Presionar --> ",0
Msg3 byte "Especial",0
Msg4 byte "ENTER",0
Msg5 byte "ESPERA",0

Tecla byte ? ;Código de Tecla Presionada.

.code

;*************************************************************************************************
; FUNCIÓN MAIN *
;*************************************************************************************************

main PROC

mov edx, OFFSET Msg1 ;Muestra mensaje inicial.


call WriteString
call Crlf
call Crlf

Ciclo: call ReadKey ;Ciclo de Espera de Tecla.


jnz Teclas
mov edx, OFFSET Msg5
call WriteString
call Crlf
mov eax,1000
call Delay
jmp Ciclo

Teclas: mov edx, OFFSET Msg2 ;Prepara puntero a Mensaje 2.


call WriteString
cmp Al,0 ;Compara Código de Tecla.
je Tfunc ;Si es Tecla Especial Salta.
mov Tecla,Al ;Tecla recibida es una Lectra (ASCII).
cmp Al,13 ;Revisa si tecla presionada es un ENTER
je Tenter
call WriteChar ;Escribe letra en Consola.
call Crlf
jmp Ciclo ;Vuelve a ciclo de espera de tecla.

Tfunc: mov Tecla,Ah ;Tecla Especial.


mov edx, OFFSET Msg3 ;Indica que se recibió tecla especial.
call WriteString
call Crlf
jmp Ciclo ;Vuelve a ciclo de espera de tecla.

Tenter: mov edx, OFFSET Msg4


call WriteString
call Crlf
jmp Ciclo

main ENDP

END
Ejemplo 8

; UNIVERSIDAD DE COSTA RICA - SEDE GUANACASTE


; IF-4000 ARQUITECTURA DE COMPUTADORES
; EJEMPLO 08: Uso de Funciones Propias y Función GotoXY.
; FECHA: 17/11/2015

INCLUDE c:\Irvine\Irvine32.inc
INCLUDELIB c:\Irvine\Irvine32.lib

.listall
.stack 100h ; Inicializa el Puntero de Pila.

.data ; Directiva de Inicio de Variables.

MFil byte ? ; Fila Máxima.


MCol byte ? ; Columna Máxima.
Fil byte ? ; Fila Seleccionada.
Col byte ? ; Columna Seleccionada.

Af1 byte " 0 ",0 ; A.


Af2 byte " 0 0 ",0
Af3 byte "0 0",0
Af4 byte "00000",0
Af5 byte "0 0",0

Df1 byte "000 ",0 ; De.


Df2 byte "0 0 ",0
Df3 byte "0 0",0
Df4 byte "0 0 ",0
Df5 byte "000 ",0

Cf1 byte " 0000 ",0 ; Ce.


Cf2 byte "0 ",0
Cf3 byte "0 ",0
Cf4 byte "0 ",0
Cf5 byte " 0000 ",0

.code

;*************************************************************************************************
; FUNCIÓN MAIN *
;*************************************************************************************************

main PROC

mov dh,8 ; Cargar Coordenada de Fila.


mov dl,8 ; Cargar Coordenada de Columna.
mov ecx, OFFSET Af1 ; Letra T.
call WChar ; Dibujar un Cero en las Coordenadas Seleccionadas.

mov dh,8 ; Nuevas Coordenadas.


mov dl,15
mov ecx, OFFSET Df1 ; Letra F.
call WChar ; Dibujar un Cero en las Coordenadas Seleccionadas.

mov dh,8 ; Nuevas Coordenadas.


mov dl,22
mov ecx, OFFSET Cf1; Letra F.
call WChar ; Dibujar un Cero en las Coordenadas Seleccionadas.

call Crlf ; Cambio de Línea.


call Crlf
call WaitMsg ; Pausa.
nop

exit

main ENDP

;*************************************************************************************************
; FUNCIÓN WChar - Dibuja el Caracter Apuntado por ECX en las Coordenadas DH (F) y DL (C).
;*************************************************************************************************

WChar PROC

mov Fil,dh ; Guarda Coordenadas Seleccionadas.


mov Col,dl

call GetMaxXY ; Tomando Tamaña de la Ventana de Consola.


mov MFil,al
mov MCol,dl
cmp al,Fil ; Se prueba si Coordenadas son Válidas.
jl GoOut
cmp dl,Col
jl GoOut

mov dh,Fil ; Posición Inicial del Cursor.


mov dl,Col

call GotoXY ; Posicionando el Cursor.


push edx ; Guardando EDX en la Pila.
mov edx, ecx ; Escibiendo Línea 1 de Letra.
call WriteString
pop edx ; Sacando EDX de la Pila.

inc dh ; Ajustando Fila y Reposicionando.


add ecx,6 ; Paso a Siguiente Fila de Letra.
call GotoXY
push edx ; Guardando EDX en la Pila.
mov edx, ecx ; Escribiendo Línea 2 de Letra.
call WriteString
pop edx ; Sacando EDX de la Pila.

inc dh ; Ajustando Fila y Reposicionando.


add ecx,6 ; Paso a siguiente Fila de Letra.
call GotoXY
push edx ; Guardando EDX en la Pila.
mov edx, ecx ; Escibiendo Línea 3 de Letra.
call WriteString
pop edx ; Sacando EDX de la Pila.

inc dh ; Ajustando Fila y Reposicionando.


add ecx,6 ; Paso a siguiente Fila de Letra.
call GotoXY
push edx ; Guardando EDX en la Pila.
mov edx, ecx ; Escibiendo Línea 4 de Letra.
call WriteString
pop edx ; Sacando EDX de la Pila.

inc dh ; Ajustando Fila y Reposicionando.


add ecx,6 ; Paso a siguiente Fila de Letra.
call GotoXY
push edx ; Guardando EDX en la Pila.
mov edx, ecx ; Escibiendo Línea 5 de Letra.
call WriteString
pop edx ; Sacando EDX de la Pila.

GoOut: nop ; No operación.

RET

WChar ENDP

;*************************************************************************************************
; FINAL DEL PROGRAMA
;*************************************************************************************************

END
Ejemplo 9
; UNIVERSIDAD DE COSTA RICA - SEDE GUANACASTE
; IF-4000 ARQUITECTURA DE COMPUTADORES
; EJEMPLO 08: Llamadas a Funciones Propias.
; FECHA: 17/11/2015

INCLUDE c:\Irvine\Irvine32.inc
INCLUDELIB c:\Irvine\Irvine32.lib

.listall
.stack 100h ;Inicializa el Puntero de Pila.

.data ;Directiva de Inicio de Variables.

Msg1 byte "APLICACION DE LA PILA DEL CPU",0


Msg2 byte "Inserte un Numero : ",0
Msg3 byte "Arreglo Original --> ",0
Msg4 byte "Arreglo Invertido --> ",0

Numso dword 4 dup(0) ;Arreglo original de números.


Numsi dword 4 dup(0) ;Versión invertida de Numso.

.code

;*************************************************************************************************
; FUNCIÓN MAIN *
;*************************************************************************************************

main PROC

mov eax,white + (blue*16) ; Letras blancas en fondo azul.


call SetTextColor
mov edx, OFFSET Msg1 ; Escribe mensaje inicial.
call WriteString
call Crlf
call Crlf

mov edi, OFFSET Numso ;EDI Apunta a Inicio de Numso.


mov ebx, lengthof Numso ;EBX tiene longitud de Numso.
call Rvec ;Procedimiento Lectura de Vector.

mov edx, OFFSET Msg3 ;Mensaje de Despliegue de Numso.


call WriteString
mov esi, OFFSET Numso ;ESI Apunta a Inicio de Numso.
mov ebx, lengthof Numso ;EBX tiene longitud de Numso.
call Wvec ;Procedimiento Depliega Vector.

mov edx, OFFSET Msg4 ;Mensaje de Despliegue de Numsi.


call WriteString
mov edi, OFFSET Numsi ;EDI Apunta a Inicio de Numsi.
mov esi, OFFSET Numso ;ESI Apunta a Inicio de Numso.
mov ebx, lengthof Numso ;EBX tiene longitud de Numso.
call Invec ;Procedimiento Invierte Vector.
mov esi, OFFSET Numsi ;ESI Apunta a Inicio de Numsi.
mov ebx, lengthof Numsi ;EBX tiene longitud de Numsi.
call Wvec ;Procedimiento Depliega Vector.

exit

main ENDP

;*************************************************************************************************
; FUNCIÓN RVEC - Carga el vector apuntado por ESI, longitud en EBX, con datos de usuario.
;*************************************************************************************************

Rvec PROC

cmp ebx,0 ;Revisa si hay espacio en vector.


je FinR ;Si no hay espacio, sale.

CicloR: mov edx, OFFSET Msg3 ;Muestra mensaje para insertar dato.
call WriteString
call ReadDec ;Lee dato del teclado.
mov [edi],eax ;Lo guarda en vector.
dec ebx ;Revisa y debe pedir otro dato.
jz FinR ;Listo, vector lleno, salta a salida.
add edi,4 ;Incrementa puntero de vector y vuelve a ciclo.
jmp CicloR

FinR: call Crlf ;Pasa a siguiente línea y retorna.

RET

Rvec ENDP

;*************************************************************************************************
; FUNCIÓN WVEC - Despliega el contenido del vector apuntado por ESI y longitud en EBX
;*************************************************************************************************

Wvec PROC

cmp ebx,0 ;Revisa si hay datos en vector.


je FinW ;Si no hay datos, sale.

CicloW: mov eax,[esi] ;Toma un dato del vector.


call WriteDec ;Lo muestra en Consola.
mov al,' ' ;Escribe un espacio al lado del número.
call WriteChar
dec ebx ;Revisa si escribió todos los
elementos.
jz FinW ;Ya mostró todo el vector, salta a salida.
add esi,4 ;Incrementa puntero de vector y vuelve a
ciclo.
jmp CicloW
FinW: call Crlf ;Pasa a siguiente línea.
call Crlf ;Pasa a siguiente línea y retorna.

RET

Wvec ENDP

;*************************************************************************************************
; FUNCIÓN INVEC - Carga Vector Apuntado por EDI con Datos de Vector Apuntado por ESI Invertidos
;*************************************************************************************************

Invec PROC

mov ecx,ebx ;Hace una copia de la longitud de los vectores.

Cic1: mov eax,[esi] ;Toma un dato de Numso.


push eax ;Lo guarda en la Pila.
dec ebx ;Revisa si hay más datos en Numso.
jz Cic2 ;Si ya guardó todo los datos, salta a ciclo 2.
add esi,4 ;Incrementa puntero de Numso y vuelve a ciclo 1.
jmp Cic1

Cic2: pop eax ;Saca un dato de la pila.


mov [edi],eax ;Lo guarda en Numsi.
dec ecx ;Revisa si ya tomó todos los datos de Numso.
jz FinI ;Si ya tomó todo los datos, salta a salida.
add edi,4 ;Incrementa puntero de Numsi y vuelve a Ciclo 2.
jmp Cic2

FinI: RET ;Retorna.

Invec ENDP

;*************************************************************************************************
; FINAL DEL PROGRAMA
;*************************************************************************************************

END

Das könnte Ihnen auch gefallen