Last active
October 21, 2023 04:13
-
-
Save ManuelWiki/225aa5ae900d260ae92c5134b9fe0e40 to your computer and use it in GitHub Desktop.
Programa de TASM para determinar si un número corresponde a un año bisiesto o no. MASM/TASM program that determines if a given number corresponds to a leap year or not. This program was made for homework and shared to flex ;)
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
; TITULO: anio bisiesto | |
ideal | |
dosseg | |
model small | |
stack 256 | |
dataseg | |
codsal db 0 | |
; Mis variables { | |
anio dw 2400 | |
r db ? | |
;} | |
codeseg | |
proc PrintDecimal | |
push ax | |
push bx | |
push cx | |
push dx | |
; check if negative | |
test ax,08000h | |
jz PositiveAx | |
; put '-' on the screen | |
push ax | |
mov dl,'-' | |
mov ah,2 | |
int 21h | |
pop ax | |
neg ax ; make it positive | |
PositiveAx: | |
mov cx,0 ; will count how many time we did push | |
mov bx,10 ; the divider | |
put_mode_to_stack: | |
xor dx,dx | |
div bx | |
add dl,30h | |
; dl is the current LSB digit | |
; we cant push only dl so we push all dx | |
push dx | |
inc cx | |
cmp ax,9 ; check if it is the last time to div | |
jg put_mode_to_stack | |
cmp ax,0 | |
jz pop_next ; jump if ax was totally 0 | |
add al,30h | |
mov dl, al | |
mov ah, 2h | |
int 21h ; show first digit MSB | |
pop_next: | |
pop ax ; remove all rest LIFO (reverse) (MSB to LSB) | |
mov dl, al | |
mov ah, 2h | |
int 21h ; show all rest digits | |
loop pop_next | |
pop dx | |
pop cx | |
pop bx | |
pop ax | |
ret | |
endp PrintDecimal | |
inicio: | |
mov ax, @data | |
mov ds, ax | |
; ###################### ALGORITMO ######################## { | |
; Aqui usaremos la instruccion div, con un operando de tamanio palabra: | |
; Esta operacion divide 'dx:ax' entre ese operando | |
; Ese operando debe ser un registro o una localidad. No puede ser inmediato | |
; así que moveremos el año que queremos dividir a 'ax' | |
mov ax, [anio] | |
; y limpiaremos dx | |
xor dx, dx | |
; Cuando lo dividimos, el sobrante se guarda en 'dx' | |
; Copiamos el número 4 a 'bx' para dividir el anio entre 4 | |
mov bx, 4 | |
; dividimos. Recuerda que se esta dividiendo dx:ax (donde guardamos el anio) entre bx (el 4) | |
div bx | |
; Comparamos el sobrante con 0 | |
cmp dx, 0 | |
jne NoEs ; Si el sobrante NO es igual a 0, entonces no es bisiesto, asi que saltamos a NoEs | |
; Si el sobrante es igual a 0, hacemos lo siguiente { | |
; volvemos a copiar el anio a 'ax' y lo dividimos entre 400 para ver si es divisible | |
mov ax, [anio] | |
; No olvides limpiar 'dx' de nuevo | |
xor dx, dx | |
; Copiamos el 400 a bx | |
mov bx, 400 | |
div bx | |
; El sobrante se ha guardado en 'dx' (otra vez) y veremos si es igual a 0 (o sea si el anio es divisible entre 400) | |
cmp dx, 0 | |
je SiEs ; si el sobrante es 0, entonces el anio es divisible entre 400, 100 y 4, asi que saltamos a SiEs | |
; Si no, puede que sea divisible entre 4 y 100, o solo divisible entre 4. Lo averiguaremos { | |
; Volvemos a copiar anio a 'ax' | |
mov ax, [anio] | |
; Y limpiamos 'dx' otra vez | |
xor dx, dx | |
; Copiamos 100 a 'bx' para hacer la division | |
mov bx, 100 | |
; Dividimos entre dx:ax (anio) entre bx (100) para que el sobrante se guarde en 'ah' | |
div bx | |
; comparamos el sobrante con 0 | |
cmp dx, 0 | |
je NoEs ; Si el sobrante es 0, entonces el anio es divisible entre 4 y 100, asi que no es bisiesto. Entonces saltamos a NoEs | |
; Si el sobrante no es 0, entonces solo es divisible entre 4. Entonces saltamos a SiEs | |
jmp SiEs | |
; } | |
; } | |
NoEs: | |
mov [r], 'N' | |
jmp salir | |
SiEs: | |
mov [r], 'S' | |
jmp salir | |
; } | |
salir: | |
mov ah, 04Ch | |
mov al, [codsal] | |
int 21h | |
end inicio |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment