Hola a todos, estoy tratando de hacer un pequeño retardo de unos segundos (de 5 a 10 ) en ensamblador, y lo intente haciendo un ciclo, pero resulta que el retardo es muy pequeño, alguien sabe como hacerlo que tarde 5 o más segundos?...
Aqui les dejo el codigo.
pila segment stack "STACK"
pila ends
data segment
data ends
code segment
assume cs:code,ds:data,ss:pila
inicio:
mov dl,01010000b ; para imprimir 1
mov ah,02h ;para imprimir 1
int 21h ;para imprimir 1
;uno:
;cmp dl,57
;ja sub dl 1
mov bx, 65000
cinco:
cmp bx, -65000
ja uno
jna dos
;mov dl,00010000b ; para imprimir 1
;mov ah,02h ;para imprimir 1
;int 21h
uno:
;mov dl,10000000b ; para imprimir 1
sub bx,1
mov dl, 'a' ; para imprimir 1
mov ah,02h ;para imprimir 1
int 21h
jmp cinco
dos:
mov dl, 'b' ; para imprimir 1
mov ah,02h ;para imprimir 1
int 21h
MOV AX, 4C00h ;halt dos dice que es la terminacion del programa
INT 21h ;;int rebisa lo que esta en 21h.
;es la interrupcion de pantalla con la funcion 4c que es la de hald
code ends
end inicio
Del libro "Ensamblador para DOS, Linux y Windows":
;----------------------------
; Procedimiento que provoca
; una espera de N segundos
;
; Espera recibir en CX el
; número de segundos
;----------------------------
Espera:
pusha ; guardar registros
; obtenemos el número
; de minutos y segundos que
; indica el reloj ahora
call SegundosActual
; lo movemos a BX
mov ax, bx
; y le sumamos los segundos
; a esperar
add ax, cx
Bucle1:
; vigilamos los minutos y
; segundos del reloj
call SegundosActual
; viendo si ya se ha completado
; la espera
cmp ax, bx
; volviendo al bucle
; de no ser así
ja Bucle1
popa ; recuperamos registros
ret ; y volvemos
;----------------------------
; Procedimiento que obtiene
; los minutos y segundos del
; reloj, los convierte a
; segundos y devuelve en BX
;----------------------------
SegundosActual:
push ax ; guardamos AX
; queremos leer los minutos
mov al, 2
out 70h, al
in al, 71h
; los multiplicamos por 60
mov bl, 60
mul bl
; y guardamos en BX
mov bx, ax
; queremos leer los segundos
xor al, al
out 70h, al
in al, 71h
; los sumamos
xor ah, ah
add bx, ax
pop ax ; y volvemos
ret
:D
mi formar de hacerlo fue la siguiente:
init5:
mov ah,2ch ;dh=segundos
int 21h
mov bh, dh ;bh=segundos
add dh, 3 ; esto para modificar los segundos
mov bl, dh ;bl=segundos +5
cmp bl,60
ja mayor
jmp cinco
cinco:
cmp bl, bh
jne uno
jmp losdos
uno:
mov ah,2ch
int 21h
mov bh, dh ;aora bh=segundos
jmp cinco
mayor:
sub bl,60
jmp cinco
conste que se poco de ensamblador jeje
Puedes tambien llamar a la funcion
Sleep
De Win32 y pasarle la cantidad de Milisegundos que quieres dormir..
Dulces sueños...
Saludos