· Начало · Отвђтить · Статистика · Поиск · FAQ · Правила · Установки · Язык · Выход · WASM.RU · Noir.Ru ·

 WASM Phorum —› WASM.ASSEMBLER —› помогите плиз с прогой...

Посл.отвђт Сообщен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