Консультация № 23379
12.07.2005, 00:38
0.00 руб.
0 3 2
Здравствуйте,
В ассемблере я пока что новичок, начал изучать с MS DOS, сразу же появилось несколько вопросов:
1. Прерывания. (например int 21), как я понял это функции, то есть набор каких-то команд, программа посылает значения соответствующих регистров в функцию (например int 21). И в этой функции происходят какие-то действия. Прав ли я? Если да, то хотелось бы узнать как можно увидеть ассемблерный код, того или иного прерывания.
Для примера рассмотрим например int21 (0ah) – ввод строки с клавиатуры, в программе мы указываем максимальную длину строки, если пользователь набирает больше символов чем установленный максимум, происходит вывод звукового сигнала и символы больше не принимаются, можно ли как-то просмотреть этот 0ah и обойти ту часть кода которая выводит звуковой сигнал (пикает speaker)
2. Как я уже сказал изучаю пока что DOS, хотел узнать как в ассемблере од DOS задействовать мышь (как я понял Mouse.com везде стандартный драйвер) или какие надо ставить Breakpoint’ы в работе с DOS программами чтобы отловить нажатие кнопки мыши.
Большое спасибо.

Обсуждение

Неизвестный
12.07.2005, 13:09
общий
это ответ
Здравствуйте, Freshman!

1. Да, прерывания это набор стандартных функций либо BIOS, либо операционной системы. Плюс есть несколько зарезервированных прерываний для драйверов (например, для драйвера EMS), и часть прерываний доступна для пользователя.

Увидеть ассемблерный код можно сняв дамп памяти по соответствующему адресу прерывания и скормив его дизассемблеру. Либо используя отладчики, которые умеют трассировать прерывания. Либо просто установив нужный адрес в окне команд.

Обойти часть кода, издающего beep можно либо забив его командой NOP (90h), либо поставив IRET (выход из прерывания) или JMP на команду, идущую за командами пищания.

2. За работу мыши отвечает прерывание 33h. Посмотри описание его функций...
давно
Советник
419
1012
14.07.2005, 22:38
общий
это ответ
Здравствуйте, Freshman!
мышь - это COM-порт. это прерывания. 0Ch для COM1.
порты есть. это 3FDh - входное значение при поступлении прерывания.

смотри файл. там есть код для обнаружения нажатия на среднюю кнопку .
всё это очень просто.

mov dx,3fdh
in al,dx
mov ah,al
mov dl,0f8h
in al,dx
xchg al,ah
mov dl,0fdh
out dx,al
mov al,ah
call printdec@
..........

proc printdec@
push ax
xor si,si
xor ah,ah
mov cl,100
div cl
movzx dx,ah
call dec1

mov cl,10
div cl
movzx dx,ah
call dec1

inc si
call dec1
mov ax,72ch
stosw
pop ax
ret
endp

proc dec1
add al,48
cmp al,48
jnz dec2
or si,si
jz dec3
dec2:
inc si
mov ah,7
stosw
dec3:
mov ax,dx
ret
endp

Писалось всё это в далёком 1999 году ;)

Удачи!

давно
Советник
419
1012
14.07.2005, 22:40
общий
Ayl, 33h прерывание - это слишком просто ;)------также для того, чтобы не пиликало, можно просто сделать. не нужно ничего забивать NOP-ами, а просто перехватить прерывание и проверять на семёрки и менять их на пробелы ;)))
Форма ответа