Challenge - ¿Qué hace éste programa?

in #cervantes7 years ago (edited)

lost-places-1719531_1920.jpg
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:

  1. IMG1

Coin Marketplace

STEEM 0.18
TRX 0.14
JST 0.029
BTC 57174.31
ETH 3071.24
USDT 1.00
SBD 2.40