PDA

View Full Version : [assembly]introdurre ritardo


Label84
27-07-2006, 21:10
Ciao a tutti, ho bisogno di un consiglio su assembly.
Nel mio programma devo introdurre un ritardo di circa un secondo.....
per ora uso un ciclo di NOP, ma so che non è una cosa molto elegante!!! :)
Qualcuno ha qualche consiglio ? Qual'è il modo migliore per introdurre un ritardo di questo ordine di grandezza?

grazie a tutti in anticipo!!

repne scasb
28-07-2006, 08:09
; Ritardo di un secondo (circa)
;
; Nota: esiste la possibilta' di ottenere
; qualcosa di assai piu' preciso

DTIMESECS EQU 1
TIMERTICKSOFF EQU 6Ch
TICKSPERSECS EQU 18

push ds
push 40h
pop ds
push eax
push ebx
mov eax,dword [TIMERTICKSOFF]
loop_delay:
mov ebx,dword [TIMERTICKSOFF]
sub ebx,eax
cmp ebx,DTIMESECS * TICKSPERSECS
jbe loop_delay
pop ebx
pop eax
pop ds


In alternativa:


mov ah,86h
mov cx,0Fh
mov dx,4240h
int 15h

andbin
29-07-2006, 10:10
mov ah,86h
mov cx,0Fh
mov dx,4240h
int 15h
Non funziona su un sistema Win2000/XP.

Label84
29-07-2006, 10:16
Si, purtroppo non funziona su xp....cmq ringrazio molto repne scasb, la prima funzione che hai postato mi sarà sicuramente utilissima!!!! grazie!
La

repne scasb
29-07-2006, 11:10
Si, purtroppo non funziona su xp


Cio' mi e' noto, non mi era noto che ti servisse del codice x86/16-bit da far girare con Windows XP. Comunque puoi riscrivere la funzione 86h dell'int 15h:


; DX:AX = Attesa in microsecondi
;
; Attende n microsecondi

Delay_Mcs proc near

pushad
push dx
push ax
pop eax
imul eax,315d
xor edx,edx
mov ebx,264d
div ebx
push eax
pop ax
pop dx
call Read_Timer
add ax,bx
adc dx,0h
je loop_final_delay
loop_delay_timer:
mov cx,bx
call Read_Timer
cmp bx,cx
jnb loop_delay_timer
dec dx
jne loop_delay_timer
loop_final_delay:
call Read_Timer
cmp bx,ax
jb loop_final_delay
popad
ret
Read_Timer:
push ax
pushf
cli
xor al,al
out 43h,al
call Dummy_Ret
in al,40h
xchg ax,bx
call Dummy_Ret
in al,40h
mov bh,al
not bx
popf
pop ax
Dummy_Ret:
ret

Delay_Mcs endp

repne scasb
29-07-2006, 11:14
NOTA: le porte 40h/43h non fanno parte le TRAP_IO di Windows XP.