Delay на Ассемблере...
как делают задержки при приграммировании последовательного порта, ведь между витами есть промежутки и их точно нужно задать...
Могу ошибаться,но там таймеры юзают. Точнее может завтра попробую сказать
int 15h, функция ah=86h,в cx:dx сколько ждать в микросекундах.
Для задержки можешь заюзать BIOS'овское
int 15h, функция ah=86h,в cx:dx сколько ждать в микросекундах.
что то не пашет:(
.model tiny
.code
.386
org 100h
Begin:
mov ah,10h
int 16h
mov dx,20000
mov ah,86h
int 15h
mov ah,9
lea dx,str1
int 21h
mov ah,10h
int 16h
ret
str1 db "String...",0Dh,0Ah,'$'
end Begin
что то не пашет:(
.model tiny
.code
.386
org 100h
Begin:
mov ah,10h
int 16h
[COLOR=green]xor cx,cx[/COLOR]
mov dx,20000
mov ah,86h
int 15h
[COLOR=green]jc TimerBusy[/COLOR]
mov ah,9
lea dx,str1
int 21h
mov ah,10h
int 16h
[COLOR=green]TimerBusy:[/COLOR]
ret
str1 db "String...",0Dh,0Ah,'$'
end Begin
delay macro time
local ext,iter1,iter2,goout
push cx
push bx
xor bx,bx
mov cx,time
cmp cx,0
je goout
ext:
push cx
mov cx,00D0h
iter1:
push cx
mov cx,0FFFFh
iter2:
loop iter2
pop cx
loop iter1
pop cx
loop ext
goout:
pop bx
pop cx
endm
.model tiny
.code
.386
org 100h
Begin:
mov ah,10h
int 16h
xor cx,cx
mov dx,20000
mov ah,86h
int 15h
mov ah,9
lea dx,str1
int 21h
mov ah,10h
int 16h
ret
str1 db "String...",0Dh,0Ah,'$'
end Begin
А как же сдесь сделать задерку хотябы на 1 секунду?
.code
.386
org 100h
Begin:
mov ah,10h
int 16h
mov cx,15
mov dx,16960
mov ah,86h
int 15h
jc TimerBusy
mov ah,9
lea dx,str1
int 21h
mov ah,10h
int 16h
TimerBusy:
ret
str1 db "String...",0Dh,0Ah,'$'
end Begin
вроде так.
.model tiny
.code
.386
org 100h
Begin:
mov ah,10h
int 16h
mov cx,15
mov dx,16960
mov ah,86h
int 15h
jc TimerBusy
mov ah,9
lea dx,str1
int 21h
mov ah,10h
int 16h
TimerBusy:
ret
str1 db "String...",0Dh,0Ah,'$'
end Begin
вроде так.
Я наверное что то сдесь глобального не понимаю... ну не получается и все:
.code
.386
org 100h ;*.com файл
Begin:
mov ah,10h
int 16h ;нажимаем кнопку...
mov cx,15
mov dx,16960
mov ah,86h
int 15h ;идет задержка
mov ah,9
lea dx,str1
int 21h ;выводим строчку (что бы
;визуально наблюдать задержку
;от нажатия кнопки до
;появления месаги)
mov ah,10h
int 16h ;опять считываем клавишу что бы
;сразу не закончить прогу
ret
str1 db "String...",0Dh,0Ah,'$'
end Begin
Что сдесь не так? Почему видимой задержки нету?
Что сдесь не так? Почему видимой задержки нету?
Только что проверил. Под чистым DOS'ом (с флоппика) работает правильно. Правда я в виде exe компилил, но не думаю, что это важно. Т.к. под виндами exe тоже не работал как надо
Только что проверил. Под чистым DOS'ом (с флоппика) работает правильно. Правда я в виде exe компилил, но не думаю, что это важно. Т.к. под виндами exe тоже не работал как надо
Да, давненько я заметил, что под виндой (XP) 15h не работает вообще, потому пришлось сделать гору вложенных циклов и вроде все Ok.
Так что если delay нужен подвиндозный, то макрос, описанный выше - наиболее простой вариант (на мой взгляд).
Да, давненько я заметил, что под виндой (XP) 15h не работает вообще, потому пришлось сделать гору вложенных циклов и вроде все Ok.
Так что если delay нужен подвиндозный, то макрос, описанный выше - наиболее простой вариант (на мой взгляд).
Так а как этот макрос использовать?(я новичек в асме ...)
если тебе оно надо под винду, то юзай API(Sleep к примеру).
Так а как этот макрос использовать?(я новичек в асме ...)
собсно просто пишешь как простую команду, а как операнд указываешь задержку (в мс)
Например:
...
delay 1000 ;1секунда
...
Сам текст макроса описывай где-нибудь вне сегментов, т.к он нужен только транслятору и в том месте, где ты его описываешь не будет сгенерирован код.
Транслятор потом вставит вместо delay 1000 весь тот кусок, который написан в тексте макроса и потом сгенерирует код.
Вообще работает как процедура с параметром в Паскале...
Лови, [color=red]на моем компе[/color] делает нормальную задержку (в миллисекундах как в Паскале)
Разумеется под свой комп можно настроить, если поменять цифры во внутренних циклах, лично я недолго настраивал под 2,6 ГГц.