Crear un delay en asm

Iniciado por danielo-, 29 Octubre 2010, 04:49 AM

0 Miembros y 1 Visitante están viendo este tema.

danielo-

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.

Código (asm) [Seleccionar]

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

Eternal Idol

Del libro "Ensamblador para DOS, Linux y Windows":

Código (asm) [Seleccionar]
;----------------------------
; 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
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón

danielo-

 :D
mi formar de hacerlo fue la siguiente:

Código (asm) [Seleccionar]

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

Yurix

#3
Puedes tambien llamar a la funcion
Sleep
De Win32 y pasarle la cantidad de Milisegundos que quieres dormir..

Dulces sueños...

Saludos


http://kapetres.wordpress.com/ < Mi blog sobre ASM

Parece que alguien no quiere que la info sea liebre >

Alguien lo movio a ese lugar.