Вопрос № 143199: Здравствуйте, уважаемые экперты. Объясните мне, пожалуйста, 2 вопроса: 1. Почему смещение пишется в <b> ЧЕТЫРЁХ </b> цифро-буквенных обозначениях (2 байта), ведь все регистры 16-ти битные (2 байта), а память 20-ти битная (2,5 байта). Смещение (т.е...
Вопрос № 143.199
Здравствуйте, уважаемые экперты. Объясните мне, пожалуйста, 2 вопроса: 1. Почему смещение пишется в ЧЕТЫРЁХ цифро-буквенных обозначениях (2 байта), ведь все регистры 16-ти битные (2 байта), а память 20-ти битная (2,5 байта). Смещение (т.е. разница 20h-16h) при этом составляет 4 бита. Но эти 4 бита можно записать и одним числом от 0h до 0Fh. Где я неправ в своих рассуждениях? 2. По поводу флага jc Калашников в 8-ой главе пишет: "Все функции прерывания 21h устанавливают в единицу флаг переноса,
если произошла ошибка, и сбрасывают его, если ошибки не было". Возможно, это написано в контексте неудачного открытия файла функцией 3Dh прерывания 21h. Но всё равно, почему ошибка-то? Мы задали флагу определённое условие: перейти туда-то, если будет неравенство (в данном случае - не найден файл), что флаг и сделал. Вот, если бы было равенство (файл найден), то флаг бы не выполнил свою задачу, т.е. не было бы переноса.
Отправлен: 06.09.2008, 14:22
Вопрос задал: Aistesis (статус: Посетитель)
Всего ответов: 2 Мини-форум вопроса >>> (сообщений: 2)
Отвечает: Евгений Иванов
Здравствуйте, Aistesis!
1. Скажу вам по секрету: смещение пишется не в 4-х цифро-буквенных обозначениях. Оно пишется так, как угодно программисту. Так, как ему будет удобно.
Например, смещение 0F457h занимает 5 символов (6, если считать символ h на конце) и не может занимать 4. Также оно может быть записано так: 62551. Это в десятичном виде. Или так 172127o, если вы отлично владеете 8-ричной системой счисления. Или даже так 1111010001010111b, если вы маньяк двоичной.
2. Флаг C используется
в данных функциях как признак того, что произошла ошибка. Состояние флага C можно установить или сбросить вручную с помощью команд STC, CLC, поэтому от того, было "равенство" или не было, неважно.
--------- Знания - сила
Ответ отправил: Евгений Иванов (статус: Профессор) Россия, Нижний Новгород Тел.: +79519145721 WWW:Eugene Ivanov ICQ: 214889076 ---- Ответ отправлен: 11.09.2008, 10:03
Отвечает: Зенченко Константин Николаевич
Здравствуйте, Aistesis!
Память не может быть 20-ти битной при всех 16-ти битных регистрах. В данном случае речь идет о 20-ти битной адресации памяти.
На рисунке показано как получается физический адрес при сегментной адресации реального режима. Значение сегментного регистра уможенное на 16-ть складывается со значение регистра общего назначения. Механизм получения
физического адреса реализован на аппаратном уровне и для программиста практически прозрачен. С помощью такого метода можно работать с 1мб памяти.
Да ещё Смещение (т.е. разница 20h-16h) при этом составляет 4 бита. , тут Вы тоже ошиблись т.к. 20h-16h=0Аh или 10 в десятичной системе.
Не все функции этого прервания возвращают ошибку ввиде установленного флага С. К примеру этим не занимаются файловые функции (0f
h : 16h) введеные ещё в MSDOS 1.0, они возвращают код ошибки в регистре AL. Флаг переноса начали использовать только со второй версии, а сам код ошибки обрабатывается функцией 59h. Флаг переноса устанавливается функцией, как сигнал программе, что была ошибка и её нужно обработать(программа открывает не существующий файл, а потом из него ещё и данные считывает, как Вы думаете, результат работы программы будет корректным?). В языках высокого уровня обработкой ошибок занимается компилятор, он сам вставляет нужный
код в программу. В ассемблере этим должен заниматся программист. Удачи!
--------- Итерация от человека, рекурсия — от Бога (Питер Дойч)
Ответ отправил: Зенченко Константин Николаевич (статус: Профессор) Украина, Киев Тел.: +380979536619 Адрес: Украина г.Киев ---- Ответ отправлен: 11.09.2008, 12:42