Sunteți pe pagina 1din 13

PRACTICA 4: EJERCICIO 1

DOSSEG
.MODEL SMALL
.STACK 100H
.DATA

TABLA DB 12,43,-23,32,-65,73,45,91,54,96

POSITIVO DB 00
NEGATIVO DB 00
PAR DB 00
IMPAR DB 00

.CODE
INICIO:
MOV AX,@DATA
MOV DS,AX

MOV CX,10
LAZO:

MOV AL,TABLA[BX]
TEST AL,1
JZ ESPAR ;resul cero and cero num +
INC IMPAR
JMP SALIR
ESPAR:
INC PAR
SALIR:

SHL AL,1
JC NUNEG ;carry num -
INC POSITIVO
JMP SALIR2
NUNEG:
INC NEGATIVO
SALIR2:
inc bx ;siguiente ele
LOOP LAZO

FIN:
MOV AH,4Ch
int 21H
END INICIO
EJERCICIO 2

DOSSEG
.MODEL SMALL
.STACK 100H
.DATA

DATO DW 010111001110101B
NUMBITS1 DB 0
NUMBITS0 DB 0

.CODE
INICIO:
MOV AX,@DATA
MOV DS,AX
MOV DX,DATO

MOV CX,16
LAZO:

SHL DX,1
JNC ESBIT0
INC NUMBITS1
JMP SALIR
ESBIT0:
INC NUMBITS0
SALIR:

LOOP LAZO

FIN:
MOV AH,4cH
INT 21H
END INICIO
COMMENT % LABORATORIO DE SISTEMAS ELECTRàNICOS
DIGITALES
Programa que determina si un dato tiene paridad par.%

DOSSEG
.MODEL SMALL
.STACK 100h
.DATA

dato DW 000111001110101b ;Dato a examinar, lo fijo yo para facilitarme la


;comprobación del resultado
paridad DB 0H ;Variable donde se guardara el resultado

.CODE

par: mov paridad,1h


jmp FIN

INICIO:
mov ax,@data
mov ds,ax
mov ax,dato ;Guardamos en AX el dato que queremos examinar.
xor cl,cl ;Inicializamos a 0 el contador de bits leidos.
xor bl,bl ;Inicializamos a 0 el contador de bits a 1.

bucle:
clc ;Ponemos a 0 el flag de carry para que no
;nos importe el analisis del bit anterior
shr ax,1 ;Rotamos 1 posicion los bits del dato, el bit
;"eliminado" pasa al flag de carry

adc bl,0h; ;Hacemos bl(contador de unos) + 0 + carry.


;Si el flag es 1, suma 1 y si es 0, suma 0
;y el contador se queda igual
inc cl;
cmp cl,0Fh ;Lo comparamos con 15, que es numero de bits a analizar
jnz bucle ;Si no ha llegado a 15, salta atr s a la etiqueta "bucle"

;Para saber si el numero de unos es par o impar dividiremos


;entre 2 y evaluaremos el resto.
;Antes de dividir hay que preparar los datos.
mov ax,0h ;Ponemos la parte alta de Ax a 0
mov al,bl ;Guardamos el numero de unos en Ax, bueno, en nuestro caso Al
mov dl,2h ;El divisor ser de tamaño byte y de valor 2.
div dl ;Dividimos
cmp ah,0h ;comparamos el resto con 0
je par ;si es 0 la paridad es par

FIN:
mov ah,4ch
int 21h
END INICIO

COMMENT % LABORATORIO DE SISTEMAS ELECTRàNICOS


DIGITALES
Programa que construye un vector a partir de otro
invirtiendo la posición de los bits.%

DOSSEG
.MODEL SMALL
.STACK 100h
.DATA

tabla_1 db 85h,10h,3h,6h,12h,12h,40h,40h ;Dato a examinar, lo fijo yo para


facilitarme la
tabla_2 db 8h DUP(?) ;comprobación del resultado
;Variable donde se guardara el resultado

.CODE

INICIO:
mov ax,@data
mov ds,ax
;Guardamos en Al el dato que queremos examinar.
;En Bl guardaremos la solución hasta el final

mov cx,8 ;que la guardaremos en memoria


laz1:
mov al,tabla_1[di]
mov bl,0h;en bl guardamos la solución hasta el final
push cx
xor cl,cl ;Inicializamos a 0 el contador de bits leidos.

bucle:
clc ;Ponemos a 0 el flag de carry para que no
;nos importe el análisis del bit anterior
rol al,1 ;Rotamos 1 posición los bits del dato, el bit
;"eliminado" pasa al flag de carry

adc bl,0h; ;El bit de menor peso es 0 porque acaba de ser rotado
; ,y estaba inicializado a 0. As¡ que al sumar con
;carry ponemos el valor del bit invertido del dato
;origen.
ror bl,1
inc cl;
cmp cl,08h ;Lo comparamos con 8, que es numero de bits a analizar
jnz bucle ;Si no ha llegado a 8, salta atr s a la etiqueta "bucle"

mov tabla_2[di],bl ;Guardamos en memoria la solución


inc di
pop cx
loop laz1

FIN:
mov ah,4ch
int 21h
END INICIO

COMMENT % LABORATORIO DE SISTEMAS ELECTRÓNICOS


DIGITALES
Programa que muestra un numero en binario a partir
de sus cifras en binario.%

DOSSEG
.MODEL SMALL
.STACK 100h
.DATA

cifras DB 32h,39h,33h,37h,31h ;cifras no pueden corresponder


;a un numero mayor de 2^16-1 (65535)

solucion DW 0h ;Variable donde se guardara el resultado

.CODE

AsciToBinario:
sub cifras[di], 30h
jmp volver

INICIO:
mov ax,@data
mov ds,ax
xor di,di ;Inicializamos a 0 el indice de cifras (de la tabla).
mov bl,0h ;En Bx operaremos hasta llegar a la solucion.

bucle: ;En este bucle operaremos para hayar el resultado final

jmp AsciToBinario ;Ahora ya tenemos únicamente el valor binario del digito


volver:
mov ax,10 ;Preparamos los registros para multiplicar
mul bx ;multiplicamos el resultado parcial por 10

mov bx,ax ;El resultado de la multiplicación se guarda en ax, pero es nuestro


;resultado parcial que lo guardamos en bx

add bl,cifras[di]

inc di;
cmp di,05h ;Lo comparamos con 5, que es numero de cifras a analizar
jnz bucle ;Si no ha llegado a 5, salta atr s a la etiqueta "bucle"

mov solucion,bx ;Guardamos en memoria la solución

FIN:
mov ah,4ch
int 21h
END INICIO

COMMENT % LABORATORIO DE SISTEMAS ELECTRàNICOS DIGITALES


Programa que muestra las 5 cifras de un número
a partir de un numero en hexadecimal.%

DOSSEG
.MODEL SMALL
.STACK 100h
.DATA

cifras DB 5h DUP(?) ;las cifras solución al problema.

dato DW 0FFFFH ;Variable donde se introduce el dato, que no puede


;ser mayor que 2^16-1 (65535)

.CODE

BinToAscii:
add cifras[di], 30h
jmp volver

INICIO:
mov ax,@data
mov ds,ax
mov di,4h ;Inicializamos a 4 y en cada iteración restaremos uno
;hasta que sea menor que 0
mov ax,dato ;En Ax iremos dividiendo hasta llegar a la solución.
mov bx,10 ;bs ser el divisor

bucle: ;En este bucle operaremos para hallar el resultado final


xor dx,dx ;Antes de dividir limpiamos el resto de la anterior división

div bx ;dividimos por 10

mov cifras[di],dl ;En dx se guarda el resto de la división que es


;el numero decimal de la cifras

jmp BinToAscii ;Una vez convertido un digito, lo pasamos a ascii


volver:

dec di;
cmp di,00h ;Lo comparamos con 5, que es numero de cifras a analizar
jge bucle ;Si no ha llegado a 5, salta atrás a la etiqueta "bucle"

FIN:
mov ah,4ch
int 21h
END INICIO

COMMENT %LABORATORIO DE SISTEMAS ELECTRÓNICOS DIGITALES


Programa que espera la pulsación de una tecla para
mostrar la tecla pulsada mediante el mensaje:
"La tecla pulsada es X".El programa finalizar si
se pulsa esc.%

DOSSEG
.MODEL SMALL
.STACK 100h

.DATA
frase DB "La tecla pulsada es: X $"
longit EQU $-OFFSET frase

.CODE
inicio:
mov ax,@data
mov ds,ax

bucle:
mov ah, 08h ;8h es el código de la interrupción
;para leer sin mostrar el dato por pantalla
int 21h
cmp al,1bh ;Comprobamos si es escape
je FIN

;Ahora preparamos la frase para mostrarla por pantalla


;únicamente hay que cambiar la posición 22 de la cadena

mov frase[21],al
mov frase[22],0Ah ;Introducimos un salto de línea
lea dx,frase
mov ah, 09h
int 21h

;Ahora colocaremos el cursor al principio de la linea


mov ah,03h ;leemos la posición actual del cursor.
int 10h

xor dl,dl

mov ah,02h ;Colocamos el cursor en su nueva posicion


int 10h

jmp bucle

FIN:
mov ah, 4ch
int 21h

END inicio

COMMENT %LABORATORIO DE SISTEMAS ELECTRÓNICOS DIGITALES


programa que recibe por teclado 5 caracteres y si son num‚ricos
obtenga el valor binario al valor introducido.%

DOSSEG
.MODEL SMALL
.STACK 100h
.DATA

long DB 6h
longlei DB ?
cifras DB 6h dup(?)
solucion DW 0H ;Variable donde se guardara el resultado

frase DB "La cadena introducida no es válida"


longit EQU $-OFFSET frase

.CODE
AsciToBinario:
sub cifras[di], 30h
jmp volver2

NoNum:
mov bl,1h
jmp Volver

error: ;Aqu¡ mostramos el error por pantalla de dato introducido no correcto


lea dx,frase
mov ah, 09h
int 21h

mov ah,8
int 21h

;borrar pantalla

mov ah,6
xor cx,cx
mov dh,24
mov dl,79
mov bh,7
xor al,0;num líneas
int 10h

jmp fin

ComprobarNum:

cmp longlei,5h
jne NoNum ;No ha introducido 5 caracteres

bucle:
cmp cifras[di],30h
jl NoNum
cmp cifras[di],39h
jg NoNum

inc di
cmp di,5h
jne bucle

jmp Volver

Inicio:
mov ax, @data
mov ds,ax
xor si,si
xor di,di ;di ser el índice para las cifras
xor bl,bl ;Si bl = 0 los caracteres son numéricos, sino no

;Empezamos a leer los caracteres


lea dx, long
mov ah,0Ah
int 21h
jmp ComprobarNum
volver:

;Llegados aqu¡ los caracteres ya est n leidos y bl nos dice si


;son n£mericos o no

cmp bl,01
je error

COMMENT %LABORATORIO SISTEMAS ELECTRONICOS DIGITALES


Muestra en pantalla un rectángulo definido por el vértice superior
izquierdo e inferior derecho.%

DOSSEG
.MODEL SMALL
.STACK 100h
.DATA

XSupIzq DB 3
YSupIzq DB 5

XInfDer DB 20
YInfDer DB 20

.CODE

Inicio:
mov ax,@data
mov ds,ax

;Primero limpiamos la pantalla

;usaremos scroll
;mov ah, 06h ;función para hacer scroll también con 7h
;mov al, 00h ;cantidad de filas a enrollar
;mov bh, 07h ;atributos de color fondo y texto
;mov CX, 00h ;fila inicial en ch, columna inicial en cl
;mov DX, 184fh ;fila final en dh, columna final en cl
;int 10h ;ejecuta las interrupciones de video
;El registro dx ser el que nos vaya posicionando el cursor
mov dh,YSupIzq
mov dl,XSupIzq

;En cx introducimos la cantidad de columnas


xor cx,cx
mov cl, XInfDer
sub cl, XSupIzq
inc cx ;Sumamos uno para incluir tambien la
;columna del vertice inferior derecho

bucle:
;Primero nos posicionamos en la linea correcta
mov ah,02h
int 10h

;Luego pintamos la línea (el nª de columnas establecidos en cx


mov ah,09h
xor bh,bh ;Estamos en la pagina 0 siempre
mov al,0b2h ;B2h en ascii es un rectángulo opaco
mov bl,03h ;El color
int 10h

;Pasamos a la siguiente linea


inc dh
cmp dh,XInfDer
jle bucle ;Si no hemos superado la línea del vértice inferior,
;volvemos a bucle para pintar la siguiente línea

fin:
mov ah,4ch
int 21h
END Inicio

COMMENT %LABORATORIO DE SISTEMAS ELECTRàNICOS


Muestra un caracter en movimiento dejando su rastro
Se manejara con las flechas del teclado.%

DOSSEG
.MODEL SMALL
.STACK 100h
.CODE

izquierda:
sub dl,1h
jmp bucle
derecha:
add dl,1h
jmp bucle

arriba:
sub dh,1h
jmp bucle

abajo:
add dh,1h
jmp bucle

Inicio:
;Primero limpiamos la pantalla
;limpiar pantalla usando scroll
mov ah, 06h ;función para hacer scroll tambien con 7h
mov al, 00h ;cantidad de filas a enrollar
mov bh, 07h ;atributos de color fondo y texto
mov CX, 00h ;fila inicial en ch, columna inicial en cl
mov DX, 184fh ;fila final en dh, columna final en cl
int 10h ;ejecuta las interrupciones de video

;Ponemos en dx la posición inicial del cursor (el centro)


mov dh,0Ch
mov dl,24h
xor bh,bh ;la pagina siempre será 0
mov bl, 03h ;El color
mov cx,1h ;Escribira un solo caracter por refresco

bucle:

;Cada vez que se realiza el bucle, 1§ colocamos el cursor


mov ah,02h
int 10h

;Cada vez que se realiza el bucle, mostramos el caracter


mov ah,09h
mov al,0FEh
int 10h

;leemos la tecla pulsada


mov ah,10h
int 16h

cmp al,1Bh
je fin

cmp ah,4Bh
je izquierda
cmp ah,48h
je arriba

cmp ah,4Dh
je derecha

cmp ah,50h
je abajo

jmp bucle

Fin:
;Volvemos a limpiar la pantalla
;limpiar pantalla usando scroll
mov ah, 06h ;función para hacer scroll también con 7h
mov al, 00h ;cantidad de filas a enrollar
mov bh, 07h ;atributos de color fondo y texto
mov CX, 00h ;fila inicial en ch, columna inicial en cl
mov DX, 184fh ;fila final en dh, columna final en cl
int 10h ;ejecuta las interrupciones de video

mov ah, 4ch


int 21h
END Inicio

S-ar putea să vă placă și