Challenge - ¿Qué hace éste programa?
Hace un par de años, daba clases de lenguaje ensamblaldor TASM y MASM. Lenguaje de bajo nivel que hoy en día ya no es usado.
Mientras revisaba mis archivos esta mañana me encontre con un programa que solía poner de exámen a mis alumnos.
Este programa esta hecho en ensamblador x86 MASM. Reto a mis lectores a que me digan qué hace este programa. Esta comentado de manera puntual, sin embargo el reto es analizar el código y decir que es lo que hace, para que esta diseñado. Créanme, no necesitan saber programar en este lenguaje para saberlo, solo necesitan conocer los conceptos básicos de programación estructurada y mucha, pero mucha observación.
Los dejo con el código.
Ojo, todo lo que está después de punto y coma, son comentarios
.model small ;Modelo de memoria
.stack ;Directiva de la Pila
.data ;Segmento de datos
cad db 9 dup (' '),'$' ;define un arreglo de caracteres
var1 db ? ;Bytes sin inicializar
num db ?
aux db ?
.code ;segmento de código
mov ax, @data ;se inicializa el segmento de datos
mov ds, ax ;se inicializa el segmento de datos
mov var1,0 ; var1 = 0
mov ah,01h ;lectura de carácter con eco , supongamos ‘1’
int 21h ;interrupción
sub al,30h ;convertimos el carácter a número, al = 1
mov num,al ;num = al, num = 1
mov al,num ;al = num , al = 1
mov bl,10 ;bl = 10
mul bl ;al = bl * al, al = 10 * 1 = 10, como en el programa siempre se introducen dos numero, el primero será el de las decenas
y por eso es que se multiplica por diez .
mov aux,al ;aux = al, aux = 10
mov var1,0 ;repetimos el proceso para otro carácter
mov ah,01h ;lectura de carácter con eco, supongamos ‘6’( ya sería un 16 en la pantalla)
int 21h ;interrupción
sub al,30h ;convertimos el carácter a número
add aux,al ;aux = aux + al, aux = 10 + 6 = 16, y ya tenemos el número que introducimos
mov bl,aux ;bl = aux, bl = 16
mov num,bl ;num = bl, num = 16
mov ah,02h ;función para imprimir un caractér
mov dl,'=' ;caractér a imprimir =
int 21h ;interrupción, hasta este punto en la pantalla se vería algo así: 16=
mov SI,6 ;apuntador para nuestro arreglo
bin:
mov Ah,00h ;Modo de video
mov Al,num ;al = num, al = 16, por el valor de num
mov Bl,2 ;bl = 2
div Bl ;al = al / bl, al = 16 / 2
mov var1,Ah ;Ah = var1, residuo de la división lo guarda en var1, var1 = 0
mov num,Al ;num = al, num = 8, cociente de la división
mov dl,var1 ;dl = var1, dl = 0
add dl,30h ;convierte a dl en ascii
mov cad[SI],dl ;En la position 6 del arreglo guarda a dl, cad[6] ira un 0 o un 1
cmp num,1 ;Compara a num con 1
dec SI ;decrementa a SI en 1
jne bin ;Si num es diferente de 1 vuelve al inicio del ciclo
je salida ;Si es igual a 1 se va a salida
cmp num,0 ;Compara num con 0
jne bin ;Si es diferente de 0 vuelve a hacer el ciclo
je salida ;Si es igual a 0 se va a salida
salida:
mov dl,num ;dl = num, dl = 1 o 0
add dl,30h ;convierte a dl en ascii
mov cad[SI],dl ;guarda dl en el arreglo cad
mov ah,09h ;función para desplegar un mensaje en la pantalla, en este caso el arreglo
lea Dx,cad ;dato a mostrar: arreglo cad
int 21h ;interrupción
mov ax, 4c00h ;función para terminar el programa
int 21h ;interrupción
end ;fin del programa
Ref: