Logo Studenta

Lenguaje Ensamblador 2

Esta es una vista previa del archivo. Inicie sesión para ver el archivo original

PILA SEGMENT STACK
 DB 64 DUP('PILA')
PILA ENDS
DATOS SEGMENT
 msj db 0ah,0dh, 'Digita un numero', '$'
 msj2 db 0ah,0dh, 'Es perfecto', '$'
 msj3 db 0ah,0dh, 'No es perfecto', '$'
 vec db 10 dup (0)
 aux db 0
 sum db 0
DATOS ENDS
imprime macro cadena
 mov ah,09h
 mov dx,offset cadena
 int 21h
endm
pedir macro ;Pide el numero perfecto
 mov ah,01h
 int 21h
 sub ah,01h
 sub al,30h
endm
CODE SEGMENT
 ASSUME CS:CODE,SS:PILA, DS:DATOS
Inicio:		
 imprime msj ;llamada al macro para imprimir el mensaje 1
 pedir ;Llamada al macro para pedir un número
 mov cx,ax ;respaldamos el número pedido en cx
 mov aux,cl ;Movemos el mismo número a una variable auxiliar
 mov bl,00h
;Empezamos a dividir desde 1
operacion:
 inc bx 
 mov cl,aux ;Regresamos el número respaldado en la variable auxiliar
 mov ax,cx ;como la división se hacen sobre AX mandamos el número a AX.
aad ;ajuste ascii para division
 mov cx,0000 ;limpiamos CX
 mov dx,0000
 
div bx ;se divide AX/BX, ax contiene el número digitado, bx es nuestro contador que va de 1 a n
 cmp dx,00h ;Comparo DX con 0, ya que DX contiene el residuo.
 ja operacion ;si es mayor a 0 repite operacion
 jb operacion ;si es menor a 0 repita operacion
 je compara ;si es igual a 0 salta a compara
compara: ;esta etiqueta compara si bx ya llego a ser igual al número original
 cmp aux,bl
 je cmpperfecto ;si es igual pasa a comparar si es perfecto
 ja suma ;si no es igual pasa a suma
 jb suma
 
suma: ;esta etiqueta suma el valor de bl a nuestra variable sum
 add sum,bl
 jmp operacion ;se repite operacion
cmpperfecto: ;Etiqueta compara el valor sumado a
 mov al,sum
 cmp al,aux
 je perfecto
 ja noperfecto
 jb noperfecto
perfecto: ;Solo imprime que es perfecto
 imprime msj2
jmp salir
noperfecto: ;Solo imprime que NO es perfecto
 imprime msj3
 jmp salir
salir:
mov ah,04ch
int 21h
CODE ENDS
END Inicio

Continuar navegando