forum.rastrnet.ru

forum.rastrnet.ru (http://forum.rastrnet.ru/index.php)
-   Программируем (http://forum.rastrnet.ru/forumdisplay.php?f=35)
-   -   Assembler проганье (http://forum.rastrnet.ru/showthread.php?t=15291)

Format c:/ 18.03.2006 21:11

Assembler проганье
 
кто нить подскажите как сделать задержку например 1 сек или что бы ждалось нажатие любой клавиши???

Casy 18.03.2006 21:49

В плане задержки на секунду - это не все так просто, как кажется

Нужно вешать свой обработчик прерывания на функцией 251ch 21h прерывания. А перед этим еще желательно сохранить текущий обработчик(чтобы после выхода из проги восстановить его) с помощью функции 351ch. Пусть например этот обработчик на каждый тик таймера уменьшает значение какой-нить переменной на 1. 18 тиков - почти одна секунда.

Вот пример кода:
assume cs:c,ss:s,ds:d
delay = 3;задерживать будем на 3 секунды
s segment stack
dw 128 dup(?)
s ends

d segment
old1c dw 0,0
x dw ?;переменная, которую будем уменьшать
d ends

c segment
start: mov ax,d
mov ds,ax

mov ax,351ch;сохраняем текущий обработчик
int 21h
push bx
push es

mov ax,251ch
lea dx,tim;в dx адресс процедуры уменьшающей переменную
push ds
push cs
pop ds
int 21h;выполняем установку нового обработчика
pop ds

mov cx,5
mov x,18*delay;в х запихиваем кол-во секунд умноженное на 18(именно столько тиков в секунду)
m: cmp x,0;сравниваем х с 0
jnz m ;как только он уменьшиться обработчиком до 0, значит прошло ~3 секунды
mov x,18*delay;подготавливаем данные для следующей задержки
mov ah,2
mov dl,'*';для демонстрации выводим символ "*" на экран
int 21h
loop m

pop ds
pop dx
mov ax,251ch;записываем старый обработчик на историческое место в памяти
int 21h

mov ax,4c00h;выходим из проги
int 21h

tim: push ax;собсно новый обработчик
push ds
mov ax,d
mov ds,ax
dec x;уменьшаем значение
pop ds
pop ax
iret;выход из процедуры обработки прерывание(именно iret, а не ret как из обычных процедур)
c ends
end start

Если коменты понятны, да еще и правельны - значит кое что помню еще в асме:)(3 года назад все было). Текст проги - в качестве примера нам тогда писал препод.

Ждать нажатия на клавишу - проще простого. А тактика такова: есть функции, которые поддерживают ввод без эха на экране. Причем ввод нужного количества символов. Ну и делаешь ввод одного символа, без отображения. Пока символ не введут прога с места на сдвинется. Функции сам поищешь, я их уже не помню.


Текущее время: 12:41. Часовой пояс GMT +7.

Powered by vBulletin® Version 3.8.4 Patch Level 5
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot

Форум открыт в июле 2004 г.