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

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

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

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 25.01.2010, 13:10   #1
insan00b
 
Регистрация: 25.01.2010
Сообщений: 7
По умолчанию ассемблер, возврат управления в резиденте

привет всем, написана программа, подсчитывающая обращения к диску по нажатию ctrl+s, заканчивающая подсчет по нажатию ctrl+e и завершающаяся по нажатию ctrl+x. далее весь код целиком. проблема в последней строке перед iret:
Код:
jmp dword ptr CS:[oldint13]
при попытке запустить на эмуляторе выдается ошибка:
wrong parameters: jmp dword ptr [oldint13]
объясните, как правильно написать, да и в целом укажите на недочеты)
с ассемблером общаюсь пару недель, могу не знать элементарных вещей
заранее спасибо


Код:
org 100h	;начальное смещение com файла 100

; заменяем стандартное прерывание int13 - работает с обращениями к диску
mov AX,3513h    	;параметр, выдающий адрес старого обработчика в BX и ES
int 21h             ;прерывание ДОС
mov word ptr oldint13,BX	;кладет сегмент в буфер
mov word ptr oldint13+2,ES 	;кладет смещение в буфер
mov AX,2513h
mov DX,offset int13proc	;записываем в dx новый адрес 13 прерывания
int 21h				;прерывание ДОС

oldint13 db 0000h 			;хранение BX и ES через 2 байта друг от друга - оригинальный int13
msg  db '00    ',10,13,' $' ;здесь храним число обращений в символьном виде
kol db 00h 					;тут храним  кол-во обращений
flag db 00h 				;флаг включения счетчика обращений, 0 - выключен, 1 - включен

m1:
mov byte ptr flag, 00h ;отключаем подсчет обращений
mov ah,0 	;считываем клавишу, ждем ввод с клавиатуры
int 16h

cmp  ax, 1f13h  ; 
jz start		; нажата ctrl-s

cmp ax, 1205h   ;
jz m1			; нажата ctrl-e

cmp ax, 2d18h   ;
jz stop			; нажата ctrl-x

jmp m1			;пока не нажата одна из клавиш, крутимся в цикле


start:			
mov byte ptr flag, 01h ;включаем подсчет обращений
mov ah,0 ; считываем клавишу
int 16h

cmp ax, 1205h   ; нажата ctrl-e 
jz print		; выводим на экран количество обращений и переходим к ожиданию ввода с клавиатуры

cmp ax, 2d18h   ; нажата ctrl-x 
jz stop


jmp start


stop:
mov ah,4ah
int 21h


   

convert_asc proc   ; переводим шестнатеричное значение числа в аски код числа
		push bx
         mov AH, 00h ;обнуляем АН												например  al=48h — двоичный эквивалент 72
         aam 		 ;в AX BCD-число, в АН десятки в AL единицы					ah=07h,al=02h		
         add AH, 30h ;прибавляем аски-код нуля, в АН аски код числа десяток 	ah=37h  аски код числа 7
         add AL, 30h ;прибавляем аски-код нуля, в АL аски код числа единиц		al=32h  аски код числа 2  '0'=30h
         mov bl, al		;####################
         mov al, ah		;меняем местами ah,al
         mov ah, bl		;####################

        pop bx 
        ret
convert_asc endp


int13proc:		;измененный int13, вызывается автоматически при обращении к диску
push ax
push dx
mov al, byte ptr flag		;проверяем флаг счетчика обращений
cmp al, 00h 				;если счетчик отключен
jz m3						;не считая возвращаем управление оригинальному int13
							;иначе проверяем обращение

cmp ah,2 ;если чтение
jz calc	 ;то увеличим счетчик
cmp ah,3 ;если запись
jz calc	 ;то увеличим счетчик

jmp m3	 ;возвращаем управление оригинальному int13

calc:
mov al, byte ptr kol 	; считаем кол-во обращений
inc al					; увеличим счетчик
mov byte ptr kol, al 	; сохраним результат 
call convert_asc 		; переведем в аски код		 
mov word ptr msg, AX 	; сохраним результат в аски коде для вывода на экран	 
jmp m3	;возвращаем управление оригинальному int13


print:		;вывод на экран
      mov dx, offset msg;отсюда считывается адрес сообщения для вывода на экран 	
      mov AH, 09h		;параметр вывода на экран для ДОС-прерывания 
      int 21h			;ДОС прерывание
jmp m1					;переходим к ожиданию ввода

m3:			;вызов оригинального int13
pop ax
pop dx

jmp dword ptr CS:[oldint13]  ;возвращаем управление оригинальному обработчику int13

iret
insan00b вне форума Ответить с цитированием
Старый 25.01.2010, 13:17   #2
Goodwin98
equ asm
Участник клуба
 
Аватар для Goodwin98
 
Регистрация: 02.05.2009
Сообщений: 1,605
По умолчанию

У вас
Код:
oldint13 db 0000h
занимает ровно 1 байт.
Какой вопрос - такой ответ. Не забываем пользоваться поиском, гуглом.
Помощь в выполнении работ по ассемблеру ICQ:2725322O4
Goodwin98 вне форума Ответить с цитированием
Старый 25.01.2010, 13:22   #3
insan00b
 
Регистрация: 25.01.2010
Сообщений: 7
По умолчанию

в таком варианте будет лучше?
Код:
oldint13 db 10 dup(0)
и ошибка по строке
Код:
jmp dword ptr CS:[oldint13]
все равно выдается. вроде синтаксически всё верно?
insan00b вне форума Ответить с цитированием
Старый 25.01.2010, 15:45   #4
Goodwin98
equ asm
Участник клуба
 
Аватар для Goodwin98
 
Регистрация: 02.05.2009
Сообщений: 1,605
По умолчанию

Да по идее синтаксис верен, хоть и программа, вероятно, не будет работать.
А это весь код ? Вроде не хватает начала и конца.
И каким компилятором пользовались ?

Кстати, более правильно будет
Код:
oldint13 dd ?
Какой вопрос - такой ответ. Не забываем пользоваться поиском, гуглом.
Помощь в выполнении работ по ассемблеру ICQ:2725322O4
Goodwin98 вне форума Ответить с цитированием
Старый 25.01.2010, 16:12   #5
insan00b
 
Регистрация: 25.01.2010
Сообщений: 7
По умолчанию

код весь, написан со значительными вложениями знаний других людей и принят на веру после подробных пояснений о назначении каждой строки
можете указать где почитать о правильном построении кода? чего не хватает в начале и конце?

пользуюсь emu8086 v4.08

спасибо за поправки, изменил программу по вашему совету, удалось запустить, правда обращений выдает 00

Последний раз редактировалось insan00b; 25.01.2010 в 16:19.
insan00b вне форума Ответить с цитированием
Старый 25.01.2010, 16:24   #6
Goodwin98
equ asm
Участник клуба
 
Аватар для Goodwin98
 
Регистрация: 02.05.2009
Сообщений: 1,605
По умолчанию

Если скомпилировалось и запустилось, значит все, что нужно есть.
Я не пользовался этим эмулятором, может быть он, как и эмулятор винды, не передает обращение к int 13h, а пользуется какими-то своими функциями.
Код:
int13proc:		;измененный int13, вызывается автоматически при обращении к диску
push ax
push dx
.....
m3:
pop ax
pop dx
Вытаскивать из стека нужно в обратном порядке.
Какой вопрос - такой ответ. Не забываем пользоваться поиском, гуглом.
Помощь в выполнении работ по ассемблеру ICQ:2725322O4
Goodwin98 вне форума Ответить с цитированием
Старый 25.01.2010, 16:26   #7
insan00b
 
Регистрация: 25.01.2010
Сообщений: 7
По умолчанию

Цитата:
Сообщение от Goodwin98 Посмотреть сообщение
Вытаскивать из стека нужно в обратном порядке.
не заметил, спасибо
insan00b вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Возврат исходного изображения Fellot Помощь студентам 3 07.12.2009 22:51
Возврат класса kedbl4 Общие вопросы C/C++ 2 10.09.2009 01:31
Возврат управления форме при показе PopupMenu mutabor Общие вопросы Delphi 1 08.07.2008 13:43
Возврат коретки Михаил Юрьевич Общие вопросы Delphi 4 03.07.2008 20:36
Возврат управления телнет-приложению imdb Работа с сетью в Delphi 2 26.05.2008 11:16