Консультация № 143199
06.09.2008, 14:22
0.00 руб.
06.09.2008, 14:24
0 8 2
Здравствуйте, уважаемые экперты. Объясните мне, пожалуйста, 2 вопроса:
1. Почему смещение пишется в ЧЕТЫРЁХ цифро-буквенных обозначениях (2 байта), ведь все регистры 16-ти битные (2 байта), а память 20-ти битная (2,5 байта). Смещение (т.е. разница 20h-16h) при этом составляет 4 бита. Но эти 4 бита можно записать и одним числом от 0h до 0Fh.
Где я неправ в своих рассуждениях?
2. По поводу флага jc Калашников в 8-ой главе пишет: "Все функции прерывания 21h устанавливают в единицу флаг переноса, если произошла ошибка, и сбрасывают его, если ошибки не было". Возможно, это написано в контексте неудачного открытия файла функцией 3Dh прерывания 21h. Но всё равно, почему ошибка-то? Мы задали флагу определённое условие: перейти туда-то, если будет неравенство (в данном случае - не найден файл), что флаг и сделал. Вот, если бы было равенство (файл найден), то флаг бы не выполнил свою задачу, т.е. не было бы переноса.

Обсуждение

Неизвестный
08.09.2008, 15:37
общий
По поводу первого вопроса: во ВСЕХ учебниках подробно описан ответ в самом начале. Ведь без этого, никуда. ВЫ сами себя запутали. Но, возможно, что-то не поняли - уточните вопрос - попробуем объяснить по-другому
Второй вопрос: флаг - это бит в определенной области памяти, так что ЕМУ никакого условия перехода задать нельзя, но есть команды перехода по условию, чувствительные к значению флагов (определенных бит в определенной области памяти). А сути вопроса, извините , не понял
давно
Советник
419
1011
11.09.2008, 10:03
общий
это ответ
Здравствуйте, Aistesis!

1. Скажу вам по секрету: смещение пишется не в 4-х цифро-буквенных обозначениях. Оно пишется так, как угодно программисту. Так, как ему будет удобно.

Например, смещение 0F457h занимает 5 символов (6, если считать символ h на конце) и не может занимать 4. Также оно может быть записано так: 62551. Это в десятичном виде. Или так 172127o, если вы отлично владеете 8-ричной системой счисления. Или даже так 1111010001010111b, если вы маньяк двоичной.

2. Флаг C используется в данных функциях как признак того, что произошла ошибка. Состояние флага C можно установить или сбросить вручную с помощью команд STC, CLC, поэтому от того, было "равенство" или не было, неважно.
давно
Старший Модератор
31795
6196
11.09.2008, 12:42
общий
это ответ
Здравствуйте, Aistesis!

Память не может быть 20-ти битной при всех 16-ти битных регистрах.
В данном случае речь идет о 20-ти битной адресации памяти.

На рисунке показано как получается физический адрес при сегментной адресации реального режима.
Значение сегментного регистра уможенное на 16-ть складывается со значение регистра общего назначения. Механизм получения физического адреса реализован на аппаратном уровне и для программиста практически прозрачен.
С помощью такого метода можно работать с 1мб памяти.

Да ещё Смещение (т.е. разница 20h-16h) при этом составляет 4 бита. , тут Вы тоже ошиблись т.к. 20h-16h=0Аh или 10 в десятичной системе.

Не все функции этого прервания возвращают ошибку ввиде установленного флага С. К примеру этим не занимаются файловые функции (0fh : 16h) введеные ещё в MSDOS 1.0, они возвращают код ошибки в регистре AL. Флаг переноса начали использовать только со второй версии, а сам код ошибки обрабатывается функцией 59h. Флаг переноса устанавливается функцией, как сигнал программе, что была ошибка и её нужно обработать(программа открывает не существующий файл, а потом из него ещё и данные считывает, как Вы думаете, результат работы программы будет корректным?). В языках высокого уровня обработкой ошибок занимается компилятор, он сам вставляет нужный код в программу. В ассемблере этим должен заниматся программист.
Удачи!
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

давно
Советник
419
1011
11.09.2008, 15:00
общий
В языках высокого уровня обработкой ошибок занимается компилятор, он сам вставляет нужный код в программу. В ассемблере этим должен заниматся программист.


а вот здесь неточно. смотря какие ошибки. на языках высокого яровня тоже нужно обработать, например, ошибку отсутствия файла или недоступность на запись и это тоже должен писать программист - какие-то действия выполнять.
давно
Старший Модератор
31795
6196
11.09.2008, 15:28
общий
Евгений Иванов:
Любой компилятор вставляет в код программы свои обработчики RunTime Error- ошибки во время выполнения. Дизассемблируйте любую программу на писанную на ЯВУ и Вы увидете, что до начала Вашей программы ещё находится код пролога(ставит стандартные обработчики и только потом передает управление на начало), а в конце код эпилога(возвращает все в исходное состояние и завершает программу).
Цитата: из хелпа
File not found
Path not found
Disk read error
Disk write error
File not open
File not open for input
File not open for output

Программист должен писать свои обработчики тогда, когда ему не нарятся стандартные.
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

давно
Советник
419
1011
11.09.2008, 15:43
общий
я об этом и говорю.

в нормальной программе будет так - она позволит выбрать иной диск для записи, если ты ошибочно выбрал другой, на который нельзя записать, например.

стандартные же сообщения тупо выведут, что типа диск еггор и вали отсюдова с rutime error ((-:
такого никто не захочет ((-;
это приравнивается к отсутствию обработчиков в виду их бессмысленности
давно
Старший Модератор
31795
6196
11.09.2008, 16:01
общий
Ассемблер не прощает отсутствия обработчиков ошибок, ЯВУ это допускают.
Именно это я и имел ввиду в своем ответе.
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

давно
Советник
419
1011
11.09.2008, 16:46
общий
да ладно? какой смысл от пустого сообщения о том, что места на диске нет, без выбора другого диска? и программа выходит.
на ассемблере же ничего не будет показано (но это тоже можно сделать - минимальные сообщения, где именно ошибка), но программа тоже выйдет без последствий.

результат - один.
Форма ответа