|
|
| Посл.отвђт | Сообщенiе |
|
|
Дата: Дек 16, 2003 22:23:11 · Поправил: Безпощадный даос;Текст программы =) TITLE KURS (com) PROGA SEGMENT PARA 'code' assume cs:proga, ds:proga, ss:proga org 100h BEGIN: jmp INIT ;------------------------------------------------ ;ПЕРЕМЕННАЯ ДЛЯ ХРАНЕНИЯ СТАРОГО АДРЕСА ОБРАБОТЧИКА ПРЕРЫВАНИЯ old_int DD ? ;------------------------------------------------ ;ДАННЫЕ HEXTBL DB '0123456789ABCDEF' hexnum DB 00 hex_1 DB 00 hex_2 DB 00 znach DB 4 dup(0) reg_ax DB 'AX:' reg_bx DB 'BX:' reg_cx DB 'CX:' reg_dx DB 'DX:' ;------------------------------------------------ MAIN PROC ;Смотрим какая кнопка была нажата ; и либо переходим к стандартному обработчику либо выполняем программу push ax in al,60h cmp al,01 JE m1 JMP EXIT m1: pop ax pushf ;сохранение модифицируемых регистров push ax push bx push cx push dx push si push di push es ;Записываем все регистры в стек push dx push cx push bx push ax mov ax,0b800h mov ES,ax xor DI,DI mov ax,cs mov ds,ax mov ss,ax ;Задаем атрибуты символов mov ah,04h ;ВЫВОДИМ НА ЭКРАН РЕГИСТРЫ ;РЕГИСТРЫ ОБЩЕГО НАЗНАЧЕНИЯ ;AX mov al,[reg_ax]+0 call CHR_TO_SCR mov al,[reg_ax]+1 call CHR_TO_SCR mov al,[reg_ax]+2 call CHR_TO_SCR pop bx call REG_OUT call ON_SCREEN mov al,20h call CHR_TO_SCR ;BX mov al,[reg_bx]+0 call CHR_TO_SCR mov al,[reg_bx]+1 call CHR_TO_SCR mov al,[reg_bx]+2 call CHR_TO_SCR pop bx call REG_OUT call ON_SCREEN mov al,20h call CHR_TO_SCR ;CX mov al,[reg_cx]+0 call CHR_TO_SCR mov al,[reg_cx]+1 call CHR_TO_SCR mov al,[reg_cx]+2 call CHR_TO_SCR pop bx call REG_OUT call ON_SCREEN mov al,20h call CHR_TO_SCR ;DX mov al,[reg_dx]+0 call CHR_TO_SCR mov al,[reg_dx]+1 call CHR_TO_SCR mov al,[reg_dx]+2 call CHR_TO_SCR pop bx call REG_OUT call ON_SCREEN ; сообщаем BIOS что было произведенно считывание с клавиатуры in al,61h mov ah,al or al,80h out 61h,al mov al,ah out 61h,al ; разрешаем прерывания mov al,20h out 20h,al ;восстановление модифицируемых регистров pop es pop di pop si pop dx pop cx pop bx pop ax jmp m2 ;================================================ ;------------------------------------------------ ; ЗАПИСЫВАЕТ В "znach" ЗНАЧЕНИЕ ИЗ РЕГИСТРА BX (в виде символов) REG_OUT PROC push dx mov hexnum,bh call CHR_COD mov dl,hex_1 mov [znach]+0,dl mov dl,hex_2 mov [znach]+1,dl mov hexnum,bl call CHR_COD mov dl,hex_1 mov [znach]+2,dl mov dl,hex_2 mov [znach]+3,dl pop dx ret REG_OUT ENDP ;------------------------------------------------ ; ПОЛУЧЕНИЕ HEX-представления ASCII-кода СИМВОЛА ;(берет значение из "hexnum" и записывает рез-ат в "hex_1" и "hex_2") CHR_COD PROC push ax push bx mov al,hexnum xor ah,ah shr ax,04 lea bx,HEXTBL xlatb mov hex_1,al mov al,hexnum and al,0fh xlatb mov hex_2,al pop bx pop ax ret CHR_COD ENDP ;------------------------------------------------ ; ВЫВОДИТ НА ЭКРАН СОДЕРЖИМОЕ ПЕРЕМЕННОЙ "ZNACH" (4 байта) ПУТЕМ ПРЯМОЙ ЗАПИСИ В ПАМЯТЬ ON_SCREEN PROC xor si,si mov cx,4 m_0: mov al,[znach]+si mov ES:word ptr[DI],ax inc si add di,2 loop m_0 ret ON_SCREEN ENDP ;------------------------------------------------ ; ВЫВОДИТ НА ЭКРАН СИМВОЛ ЗАПИСАННЫЙ В AL С АТТРИБУТАМИ ИЗ AH CHR_TO_SCR PROC mov ES:word ptr[DI],ax add di,2 ret CHR_TO_SCR ENDP ;------------------------------------------------ ;================================================ m2: iret EXIT: pop ax jmp cs:old_int MAIN ENDP INIT PROC NEAR cli mov ax,3509h int 21h mov word ptr old_int,bx mov word ptr old_int+2,es mov ax,2509h mov dx,offset MAIN int 21h mov ax,3100h mov dx,(INIT - BEGIN + 10fh) / 16 sti int 21h INIT ENDP PROGA ENDS END BEGIN Программа должна резидентно сидеть в памяти и при нажатии нужной кнопки (в данном примере это Esc) выводить на экран значения регистров если кнопка не "наша" запускается стандартный обработчик. Она работает неправильно. Она вроде записывается в память и при нажатии кнопок работает стандартно НО стоит нажать Esc она как и положенно выводит регистры А ПОТОМ ЗАВИСАЕТ!!! и ни на что не реагирует!!! Подскажите пожалуйста в чем моя ошибка! |
|
|
Дата: Дек 17, 2003 01:02:48 Ну, бага, первая попавшаяся на мой нетрезвый взгляд. Ты узнал, что нажата Esc и переходишь на m1. Так вот, ты сначала что-то там пушиш, а только потом делаешь mov ax,cs mov ss,ax Уловил? Потом когда попить бодишь, у тебя же совершенно другая хрень в регистры попадет. |
|
|
Дата: Дек 17, 2003 02:41:43 _DEN_ спасибо большое! Это я действительно тормознул! Я это иправил но вот только она все равно не работает =( Значения в регистрах влияют на правильность выводимой информации. А прога судя по всему отработав не возвращает управление системе. Блокирует клаву и висит =( |
|
|
Дата: Дек 17, 2003 03:08:29 Давай разберемся... Я как-то тоже что-то подобное писал. Я как делал. Объявлял переменные: keep_ss dw ? keep_sp dw ? keep_ax dw ? keep_bx dw ? keep_cx dw ? ..... При входе в обработчик ПЕРВЫМ делом: mov cs:keep_ax,ax mov cs:keep_bx,cx mov cs:keep_cx,dx ... mov ax,ss mov cs:keep_ss,ax mov keep_sp,sp ... Перед выходом обратно. Главное, не забудь поставить cs: после того как ds восстановишь. Стеком не пользуйся пока ss и sp не поставишь куда надо. Сразу придумай куда тебе sp указать. Дай ему отдельный буффер. 99% что бага в неправильном восстановлении прежних значений регистров. Для того чтобы все было даже теоретически абсолютно прально, отключай прерывания (cli) на время сохранения и восстановления регистров. Если и это не поможет, можешь кинуть мне на мыло, могу поковыряться. Только мгновенного ответа не обещаю. У меня сессия сейчас скоро... сам понимаешь :( |
|
|
Дата: Дек 17, 2003 03:10:18 Блин.... я там на сохранении регистры перепутал... mov cs:keep_ax,ax mov cs:keep_bx,bx mov cs:keep_cx,cx mov cs:keep_dx,dx Но я думаю ты понял :) |
|
|
Дата: Дек 17, 2003 03:19:16 Ептить... ну и самое главное! Ты же не восстановил ss и sp! А ведь адрес возврата из прерывания хранится в стеке! iret! Угадай, куда передастся управление, если у тебя в ss:sp хрен знает что? |
|
|
Дата: Дек 20, 2003 19:40:28 _DEN_ спасибо! Нормально сделал сохранение/восстановление SS:SP и теперь прога работает как часы. С меня пиво. |
|
|
Дата: Дек 21, 2003 00:02:09 Хех... Ну если угощаешь :) Где живешь-то? |
|
|
Дата: Дек 22, 2003 00:09:04 В Москве, м.Щелковская (ну не совсем на ней но рядом) =) Стучи в асю 171679754 - Torwald. Я всегда (вот уже 2 года, непрерывно) в инвизе но обычно откликаюсь =) |
|
Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.072 |