Консультация № 141007
29.07.2008, 20:31
0.00 руб.
0 5 1
Здравствуйте, уважаемые эксперты!
У меня вопрос по главе 10 книги О.Калашникова "Ассемблер?Это просто!"
В книге, после заголовка "Как проверить работу программы" автор предлагает проверить работу разбираемой в этой главе резидентной программы(в приложении - прога 1) таким образом:
1)запустить вначале прогу1.
2)после того, как прога1 завершит свою работу запустить прогу2(ее я тоже указал в приложении)
посмотреть что происходит, и
3)запустить прогу2 в отладчике(у меня AFD). Сделал все это.
Затем ,когда я захожу внутрь прерывания 21h, код у меня отладчик показывает совсем не тот, который по идее должен быть(как в книге), а именно:
в книге:
(программа прога2 выполнила команду int 21h)
int 21
cmp ah,09
jz 010C и так далее
у меня:
(программа прога2 выполнила команду int 21h)
int21
nop
nop
call 1161
jmp Far cs:[1048]
nop
nop и так далее
Но по идее после перехвата прерывания вариант должен быть первый! почему у меня происходить совсем другое???Делаю все вроде бы верно, кучу раз проверил...В итоге прерывание перехватывается, нужная строка на экран выводится, но вот в отладчике не то, что нужно...почему???

Приложение:
(Прога1)
My segment
assume cs:My, ds:My, es:My, ss:My
org 100h
Start:

jmp Init

Int_21h_proc proc
cmp ah,9
je Ok_09
jmp dword ptr cs:[Int_21h_vect]

Ok_09:
push ds
push dx
push cs
pop ds

mov dx, offset My_string
pushf
call dword ptr cs:[Int_21h_vect]

pop dx
pop ds
iret

Int_21h_vect dd ?
My_string db 'Моя строка! $'
int_21h_proc endp

Init:
mov ah,35h
mov al, 21h
int 21h

mov word ptr Int_21h_vect,bx
mov word ptr Int_21h_vect+2,es

mov ax,2521h
mov dx, offset Int_21h_proc
int 21h

mov dx, offset Init
int 27h

My ends
end Start

(Прога2)
MySegment segment
assume cs:MySegment,ds:MySegment, es:MySegment,ss:MySegment
org 100h
Begin:
mov ah,9
mov dx, offset String
int 21h

int 20h

String db 'My String.$'

MySegment ends
end Begin

Обсуждение

Неизвестный
30.07.2008, 09:11
общий
это ответ
В данной ситуации Вы попадаете в родной обработчик DOS, а не в перехваченный, думаю Вы неправильно запускаете программу (проверил и других мыслей просто нет), если работайте под Windows, поробуйте так
На диске "C" сделайте папку "1", туда скопируете исколняемые файлы программы 1, 2 и отладчик.
Затем запустите командную строку "Пуск/Выполнить/cmd.exe"
В консольном окне введите следующие команды
cd
cd 1
1.com
adf 2.com
и сделайте трасировку, надеюсь все получится как в книге описано удачи!
Неизвестный
30.07.2008, 09:21
общий
cd
cd 1
1.com
adf 2.com
Неизвестный
30.07.2008, 09:21
общий
cd\
cd 1
1.com
adf 2.com
Неизвестный
30.07.2008, 14:51
общий
Вот только в чем у меня была ошибка? два файла программ были в корне C, AFDPRO в другом месте. В этом ошибка? Т.е. как правильно запускать в таком случае программу? Как эта разница в запускании влияет на исполнение программы.(на результат)?
Неизвестный
30.07.2008, 15:16
общий
Это никак не влияет, но если вы работаете под Windows, то можно запустить отдельно отладчик, а отдельно программу и связаны они никак не будут.
Форма ответа