Está en la página 1de 4

UNIVERSIDAD DE EL SALVADOR

FACULTAD DE INGENIERIA Y ARQUITECTURA


ESCUELA DE INGENIERIA DE SISTEMAS INFORMATICOS

MICROPROGRAMACION
GUIA DE LABORATORIO

El presente laboratorio pretende que el estudiante aplique los conocimientos para crear y
depurar programas en ensamblador que contengan arreglos. Un arreglo es una lista de
variables del mismo tipo. A diferencia de los lenguajes de alto nivel donde existen
mecanismos para declarar y usar arreglos, en ensamblador el programador tiene que crear
el código para declarar y usar los arreglos.

Editar el siguiente código en ensamblador, ejecútelo y verifique como este programa separa
los elementos de un arreglo de datos de 16 bits con signo en dos arreglos: uno que contiene
los valores positivos y otro que contiene los valores negativos. El programa utiliza un
procedimiento para efectuar la separación.
.386
.model flat, stdcall
option casemap :none
.Nolist
include \masm32\include\windows.inc
include \masm32\include\kernel32.inc
include \masm32\include\user32.inc
include \masm32\include\masm32.inc
.List
includelib \masm32\lib\kernel32.lib
includelib \masm32\lib\user32.lib
includelib \masm32\lib\masm32.lib

.DATA

TAMMAX = 20
codsal db 0
nDatos db 20
datos dw -2, 12,23,43,134,-56,-35,76,58,-34,56,-65
dw 54,76,79,-37,-73,-689,65,90
posit dw TAMMAX dup(?)
negat dw TAMMAX dup(?)

NPOS DW 0
NNEG DW 0

MSJ1 DB 13,10,"VALORES POSITIVOS: ",13,10,0


MSJ2 DB 13,10,"VALORES NEGATIVOS: ",13,10,0

IMP DB 8 DUP(" ")


CRLF DB 13,10,0
FLAG DB 0

.CODE

inicio:
mov ebx, offset datos
mov esi, offset posit
mov edi, offset negat
xor ecx,ecx
mov cl, [nDatos]
call POSNEG

invoke StdOut, addr MSJ1

invoke StdOut, addr CRLF

xor ecx,ecx
MOV CX,[NPOS]
MOV ESI, OFFSET posit

LAZO1:
PUSH ECX

MOV AX, [ESI]


PUSH ESI
LEA ESI,IMP+7
CALL WRITE

invoke StdOut, addr IMP

LEA ESI,IMP
MOV ECX,8
LA1:
MOV [ESI], BYTE PTR " "
INC ESI
LOOP LA1

POP ESI
POP ECX
INC ESI
INC ESI
LOOP LAZO1

invoke StdOut, addr MSJ2


invoke StdOut, addr CRLF

xor ecx,ecx
MOV CX,[NNEG]
MOV ESI, OFFSET negat

LAZO2:

PUSH ECX
MOV AX, [ESI]
PUSH ESI
LEA ESI,IMP+7
CALL WRITE

invoke StdOut, addr IMP

LEA ESI,IMP
MOV ECX,8
LA2:
MOV [ESI], BYTE PTR " "
INC ESI
LOOP LA2

POP ESI
POP ECX
INC ESI
INC ESI
LOOP LAZO2

salir:

invoke ExitProcess, 0

WRITE PROC
PUSH EAX
PUSH EBX
PUSH ECX
PUSH EDX

MOV ECX,10
CMP AX,0
JGE C20
NEG AX
C20:
CMP AX,CX
JB C30
XOR DX,DX
DIV CX
OR DL,30H
MOV [ESI],DL
DEC ESI
JMP C20
C30:
OR AL,30H
MOV [ESI],AL
POP EDX
POP ECX
POP EBX
POP EAX
CMP AX,0
JGE SALI
MOV [ESI-1], BYTE PTR "-"
SALI:
RET
WRITE ENDP

POSNEG proc
push eax
jcxz enddo

do:
mov ax, [ebx]
cmp ax, 0
jge posits
mov [edi], ax
inc edi
inc edi
inc [NNEG]
jmp sigue
posits:
mov [esi], ax
inc esi
inc esi
inc [NPOS]
sigue:
inc ebx
inc ebx
loop do
enddo:
pop eax
ret
POSNEG endp

END inicio

También podría gustarte