Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 14.05.2009, 15:40   #1
ViNcHeStEr
Delphi
Форумчанин
 
Регистрация: 12.06.2008
Сообщений: 137
По умолчанию Собственное прерывание на Ассемблере

Как написать собственное прерывание на Ассемблере?
Мне нужно чтобы например int 60h выводило на экран строку, но с другим цветом (например жёлтым).

Код:
;MY INT
;=============
CSEG segment ;начало сегмента
org 100h ;указывает что прога com

Begin: ;начало программы

mov ah,9h ;функция установки вектора
mov dx,offset Message ;в dx загружаем адрес сообщения Message
int 21h ;вывод строки на экран

;установка нашего прерывания
push ds ; сохраняем ds
mov dx,offset rout ;смещение для процедуры dx
mov ax, seg rout ;сегмент процедуры
mov ds,ax ;помещаем в ds
mov ah,25h ;функция установки вектора
mov al,60h ;номер вектора
int 60h ;меняем прерывание
pop ds ;восстанавливаем ds 

mov ah,10h ;функция установки вектора
int 16h ;ждём нажатие клавиши

int 20h ;выход из программы

;процедура прерывания
rout proc far ;начало процедуры
push ax ;сохраняем все изменяемые регистры
push dx ;сохраняем все изменяемые регистры
mov dx,offset message2 ;в dx загружаем адрес сообщения Message2
pop dx ;восстанавливаем регистры
pop ax ;восстанавливаем регистры
iret ;конец прерывания
rout endp ;конец процедуры

Message db 'Hello World!$' ;строка для сообщения
Message2 db 'Eto nashe preryvanie!$' ;строка для сообщения
CSEG ends ;конец сегмента
end Begin ;конец программы
ViNcHeStEr вне форума Ответить с цитированием
Старый 14.05.2009, 16:24   #2
OCTAGRAM
Oldschool geek
Форумчанин
 
Аватар для OCTAGRAM
 
Регистрация: 09.03.2009
Сообщений: 611
По умолчанию

Код:
int 60h ;меняем прерывание
я так понимаю, в этой строчке должно быть int21h
If you want to get to the top, you have to start at the bottom

http://pascal.net.ru/
OCTAGRAM вне форума Ответить с цитированием
Старый 14.05.2009, 16:29   #3
ViNcHeStEr
Delphi
Форумчанин
 
Регистрация: 12.06.2008
Сообщений: 137
По умолчанию

Всё равно не работает

C:\MASM611\BIN>ML.EXE C:\MASM611\BIN\MYINT.ASM /AT
Microsoft (R) Macro Assembler Version 6.11
Copyright (C) Microsoft Corp 1981-1993. All rights reserved.

Assembling: C:\MASM611\BIN\MYINT.ASM

Microsoft (R) Segmented Executable Linker Version 5.31.009 Jul 13 1992
Copyright (C) Microsoft Corp 1984-1992. All rights reserved.

Object Modules [.obj]: MYINT.obj/t
Run File [MYINT.com]: "MYINT.com"
List File [nul.map]: NUL
Libraries [.lib]:
Definitions File [nul.def]:
LINK : fatal error L1127: far segment references not allowed with /TINY

C:\MASM611\BIN>pause
Для продолжения нажмите любую клавишу . . .
ViNcHeStEr вне форума Ответить с цитированием
Старый 14.05.2009, 17:19   #4
OCTAGRAM
Oldschool geek
Форумчанин
 
Аватар для OCTAGRAM
 
Регистрация: 09.03.2009
Сообщений: 611
По умолчанию

Если модель tiny, то вместо
Код:
mov ax, seg rout ;сегмент процедуры
mov ds,ax ;помещаем в ds
Должно быть
Код:
mov ax, cs ;сегмент процедуры
mov ds,ax ;помещаем в ds
If you want to get to the top, you have to start at the bottom

http://pascal.net.ru/
OCTAGRAM вне форума Ответить с цитированием
Старый 14.05.2009, 17:46   #5
ViNcHeStEr
Delphi
Форумчанин
 
Регистрация: 12.06.2008
Сообщений: 137
По умолчанию

Вот теперь работает! Спасибо!

Код:
;MY INT
;=============
CSEG segment ;начало сегмента
org 100h ;указывает что прога com

Begin: ;начало программы

mov ah,9h ;функция установки вектора
mov dx,offset Message ;в dx загружаем адрес сообщения Message
int 21h ;вывод строки на экран

;установка нашего прерывания
push ds ; сохраняем ds
mov dx,offset rout ;смещение для процедуры dx
mov ax, cs ;сегмент процедуры
mov ds,ax ;помещаем в ds
mov ah,25h ;функция установки вектора
mov al,60h ;номер вектора
int 21h ;меняем прерывание
pop ds ;восстанавливаем ds 

int 60h ;наше прерывание

mov ah,10h ;функция установки вектора
int 16h ;ждём нажатие клавиши

int 20h ;выход из программы

;процедура прерывания
rout proc far ;начало процедуры
push ax ;сохраняем все изменяемые регистры
push dx ;сохраняем все изменяемые регистры
lea dx,ent ; Переход на другую строку
mov ah,9h ;функция установки вектора
int 21h ;вывод строки на экран
mov ah,9h ;функция установки вектора
mov dx,offset message2 ;в dx загружаем адрес сообщения Message2
int 21h ;вывод строки на экран
pop dx ;восстанавливаем регистры
pop ax ;восстанавливаем регистры
iret ;конец прерывания
rout endp ;конец процедуры

ENT DB 13,10,'$' ;проверка символов enter(13), пробел(10),$

Message db 'Hello World!$' ;строка для сообщения
Message2 db 'Eto nashe preryvanie!$' ;строка для сообщения
CSEG ends ;конец сегмента
end Begin ;конец программы
Скажите я правильно закоментировал вот эту строку:
ENT DB 13,10,'$' ;проверка символов enter(13), пробел(10),$

и что такое ent db ?
ViNcHeStEr вне форума Ответить с цитированием
Старый 14.05.2009, 18:08   #6
OCTAGRAM
Oldschool geek
Форумчанин
 
Аватар для OCTAGRAM
 
Регистрация: 09.03.2009
Сообщений: 611
По умолчанию

db вставляет в результирующий код любые байты. ent db -- насколько я помню ассемблер, это разместит данные и присвоит им метку. Только тут, наверное, ent: db должно быть. А, может быть, оба варианта работают.

13,10,'$' — это не проверка. Это просто байты. Чтобы с этими байтами что–то сделать, нужно взять их адрес.

Код:
lea dx,ent ; Переход на другую строку
Вот здесь в dx загружается адрес, по которому расположены 13,10,'$'. Потом вызывается прерывание in 21h, которое выводит содержимое памяти по указанному адресу, пока не встретит знак доллара. В данном случае будут выведены символы с номерами 13,10. Это контрольные символы, они вызывают перенос строки.

Если написать
Код:
ENT DB 'Test, test, test!',13,10,'$'
То будет выведена строка Test, test, test! и сделан перенос строки.
If you want to get to the top, you have to start at the bottom

http://pascal.net.ru/
OCTAGRAM вне форума Ответить с цитированием
Старый 15.05.2009, 09:49   #7
ViNcHeStEr
Delphi
Форумчанин
 
Регистрация: 12.06.2008
Сообщений: 137
По умолчанию

Всё понятно, спасибо!

А как сделать, чтобы сообщение "Eto nashe preryvanie!" выводилось жёлтым цветом?

Код:
;MY INT
;=============
CSEG segment ;начало сегмента
org 100h ;указывает что прога com, смещение 100h

Begin: ;начало программы

mov ah,9h ;функция установки вектора
mov dx,offset Message ;в dx загружаем адрес сообщения Message
int 21h ;вывод строки на экран

mov ah,10h ;функция установки вектора
int 16h ;ждём нажатие клавиши

lea dx,ent2 ; Переход на другую строку  с очисткой предыдущей
mov ah,9h ;функция установки вектора
int 21h ;вывод строки на экран

mov ah,9h ;функция установки вектора
mov dx,offset MessageEnter ;в dx загружаем адрес сообщения MessageEnter
int 21h ;вывод строки на экран

mov ah,10h ;функция установки вектора
int 16h ;ждём нажатие клавиши

;установка нашего прерывания
push ds ; сохраняем ds
mov dx,offset rout ;смещение для процедуры dx
mov ax, cs ;сегмент процедуры
mov ds,ax ;помещаем в ds
mov ah,25h ;функция установки вектора
mov al,60h ;номер вектора
int 21h ;меняем прерывание
pop ds ;восстанавливаем ds 

int 60h ;наше прерывание

mov ah,10h ;функция установки вектора
int 16h ;ждём нажатие клавиши

int 20h ;выход из программы

;процедура прерывания
rout proc far ;начало процедуры
push ax ;сохраняем все изменяемые регистры
push dx ;сохраняем все изменяемые регистры
lea dx,ent ; Переход на другую строку
mov ah,9h ;функция установки вектора
int 21h ;вывод строки на экран
mov cx,0Ah ;будет 10 циклов
cycl: ;начало цикла
lea dx,ent ; Переход на другую строку
mov ah,9h ;функция установки вектора
int 21h ;вывод строки на экран
mov ah,9h ;функция установки вектора
mov dx,offset message2 ;в dx загружаем адрес сообщения Message2
int 21h ;вывод строки на экран
loop cycl ;конец цикла
pop dx ;восстанавливаем регистры
pop ax ;восстанавливаем регистры
iret ;конец прерывания
rout endp ;конец процедуры

ENT DB 13,10,'$' ;адрес символов enter(13), пробел(10),$
ent2 db 13,'$' ;адрес символов enter(13),$

Message db 'Hello World!$' ;строка для сообщения
Message2 db 'Eto nashe preryvanie!$' ;строка для сообщения
MessageEnter db 'Press Enter$' ;строка для сообщения
CSEG ends ;конец сегмента
end Begin ;конец программы

Последний раз редактировалось Stilet; 25.05.2009 в 17:14.
ViNcHeStEr вне форума Ответить с цитированием
Старый 16.05.2009, 14:18   #8
OCTAGRAM
Oldschool geek
Форумчанин
 
Аватар для OCTAGRAM
 
Регистрация: 09.03.2009
Сообщений: 611
По умолчанию

Я думаю, это через видеопрерывание (int 10h) можно сделать. В Интернете полно списков прерываний, там и цвета можно выставлять, и прочее.

Самым простым решением, пожалуй, было бы дописать Esc–последовательность перед строкой. Таким макаром можно раскрасить всё в самые разные цвета.

Вот только, насколько я помню, в NTVDM нет ANSI драйвера, так что через int 10h надо.
If you want to get to the top, you have to start at the bottom

http://pascal.net.ru/
OCTAGRAM вне форума Ответить с цитированием
Старый 16.05.2009, 15:02   #9
ViNcHeStEr
Delphi
Форумчанин
 
Регистрация: 12.06.2008
Сообщений: 137
По умолчанию

Есть пример программы, но она не работает почему-то. Может я неправильно ассемблирую? Ассемблирую через bat файл. Ассемблер: MASM 6.11.

БАТ ФАЙЛ

Код:
ML.EXE C:\MASM611\BIN\MYINT.ASM /AT
pause
Код:
CSEG segment
org 100h

Begin:
	mov ax,0B800h
	mov es,ax
	mov di,0
	mov al,1
	mov ah,31
	mov cx,2000

Next_face:
	mov es:[di],ax
	add di,2
	loop Next_face

	mov ah,10h
	int 16h
	int 20h

CSEG ends
end Begin
Сассемблированная программа запускается, но там только чёрный экран.

Как я понял mov ah,31 атрибут символа, в данном случае ярко-белый символ на синем фоне. Я пробовал это использовать в своей программе, но не получается.
ViNcHeStEr вне форума Ответить с цитированием
Старый 16.05.2009, 15:16   #10
MalCer
Форумчанин
 
Аватар для MalCer
 
Регистрация: 15.07.2008
Сообщений: 615
По умолчанию

Хмм... В вашем примере нет ошибки. Эту прогу просто нужно запустить из под файловой оболочки DOS, тогда, как я понял, у вас появится 2000 белых рожиц на синем цвете
xor eax, eax
xchg [eax], eax
MalCer вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Собственное значение матриц. Mixasik Помощь студентам 2 18.10.2008 21:30
6 прерывание ленусик Помощь студентам 5 30.05.2008 16:57