Вопрос № 142630: Здравствуйте, уважаемые эксперты! Никак не могу разобраться в примере Главы 9 (prog009.asm). На мой взгляд программа должна работать следующим образом: 1. Процедура открытия файла происходит таким образом: сравнивает значение Handle с двойным с...
Вопрос № 142.630
Здравствуйте, уважаемые эксперты! Никак не могу разобраться в примере Главы 9 (prog009.asm). На мой взгляд программа должна работать следующим образом: 1. Процедура открытия файла происходит таким образом: сравнивает значение Handle с двойным словом 0FFFFh, т.к. они неравны то переходим к Quit_open: и устанавливаем флаг переноса в 1 (stc) затем ret возвращаемся на строчку ниже после вызова call на jc Error_file и т.к. флаг переноса =1, то переходим на закладку Error_file: при достижения возврата возвращаемся
обратно на jc Error_File и опять все заново на Error_file....Помогите разобраться.
Отвечает: Зенченко Константин Николаевич
Здравствуйте, Емельянов Дмитрий Алексеевич!
1) У Вас СОМ-программа, об этом говорит директива org 100h Этот тип испоняемых файлов имеет размер до 64кб, размещается в памяти в одном сегменте, всегда начинается с адреса 100h. Практически предтсавляет собой снимок(dump) памяти одного сегмента. А также не имеет заголовка программы. Его подставляет стандартный загрузчик DOS. При загрузке программы в память регистр SP(указатель стека)имет значение 0FFFEh - адрес вершины доступной памяти, а
также по этому адресу всегда записывается значение 0000h. При выполнении любой команды возврата(RET) из приведенного кода:
Код:
mov ah,9 mov dx,offset Mess_ok int 21h ret Error_file: mov ah,2 mov dl,7 int 21h ret
Из стека будет извлекатся значение 0000h и передаватся управление по этому адресу(CS:0000), а там находится стандартный заголовок программы, подставленый DOSом и записана там команда INT 20h(CDh 20h) - вызов функции DOS "завершить процесс". Именно поэтому и опять все заново на Error_file не будет.
2)При компиляции программы Handle dw 0FFFFh эта переменная будет иметь значение -1(0FFFFh). При запуске программы и первом вызове подпрограммы
Open_file , команда сравнения ( cmp Handle,0FFFFh ) будет сравнивать с тем значением которое туда записал компилятор, после открытия файла в эту переменную будет записано совершенно другое значение, но только не 0FFFFh.
Удачи!
--------- Итерация от человека, рекурсия — от Бога (Питер Дойч)
Ответ отправил: Зенченко Константин Николаевич (статус: Профессор) Украина, Киев Тел.: +380979536619 Адрес: Украина г.Киев ---- Ответ отправлен: 29.08.2008, 21:51 Оценка за ответ: 5 Комментарий оценки: Большое спасибо, разобрался если что спрошу еще.