Консультация № 192229
25.12.2017, 19:24
0.00 руб.
1 2 1
Здравствуйте, уважаемые эксперты!
Спасибо за предыдущие консультации.
Прошу помощи по следующим вопросам.
Как читать информацию, которую выдает отладчик AFD по Регистру Флагов?
Нечто такое – "Flags 3202". Затем, после выполнения некоторых команд, число в регистре флагов меняется, допустим, на "Flags 3200". Изменения идут, после выполнения только некоторых команд (не всех подряд).
Что лежит в стеке, после открытия простой программы (выводит строку на экран) в отладчике AFD? Я имею в виду, что обозначают записи в стеке после "+0 0000"?
Вот вид стека:
Stack +0 0000
+ 20CD
+4 9FFF
+6 9A00
Как всегда, для наглядности, я прилагаю свой файл, с более подробной информацией (есть screenshot-ы). Если можно, ответьте мне в этом же файле, комментируя мои рассуждения и отвечая на вопросы возникшие во время исследования простой программы в отладчике AFD.


Прикрепленные файлы:
67e7daab2a462634167ed31a6fc5437642dca54f.doc

Обсуждение

давно
Старший Модератор
31795
6196
26.12.2017, 15:49
общий
Адресаты:
Вам нужно только знать, что регистр флагов есть и расположение битов в самом регистре, что они значат.

Для работы в самом отладчике Вам нужна только строка, на которую Вы не обратили внимание, та которая под FLAGS - OF DF IF ... - это названия самих флагов, а ниже 0 или 1, т.е. сброшен он или установлен.


Ну начнем с того, что стек работает с регистрами SS : SP, а так как у Вас CS = DS = ES = SS, то это в начале может вводить в заблуждение.
Уровни - это содержимое стека, как это считает сам процессор.
Выполняем простой код:

и смотрим как меняется содержимое стека:

SS : SP + 0 = SS : [ FFFE ] = 0000 - это значение поставляет сама ОСь, для сом-файлов, как защита самой себя.
SS : SP + 2 = SS : [ FFFE + 2 ]= SS : [0000] = CS : [0000] - указывает на префикс программы. Я уже показывал,что сегментные регистры равны. Как только Вы будете работать с ехе-файлами, равенство регистров пропадет и все станет на свои места:
CS - будет указывать на сегмент кода;
DS = ES - на префикс программы(так уж заведено, чтобы ОСь могла передать командную строку в программу и многое другое);
SS - на сегмент стека.
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

давно
Старший Модератор
31795
6196
02.01.2018, 13:16
общий
это ответ
Здравствуйте, kerenskyaf!

Вам нужно только знать, что регистр флагов есть и расположение битов в самом регистре, что они значат.

Для работы в самом отладчике Вам нужна только строка, на которую Вы не обратили внимание,

та которая под FLAGS - OF DF IF ... - это названия самих флагов, а ниже 0 или 1, т.е. сброшен он или установлен.

Ну начнем с того, что стек работает с регистрами SS : SP, а так как у Вас CS = DS = ES = SS, то это в начале может вводить в заблуждение. Уровни - это содержимое стека, как это считает сам процессор.
Выполняем простой код:

и смотрим как меняется содержимое стека:

Для программ DOS максимальный размер сегмента 64кБ, поэтому при суммировании, к примеру FFFE + 2, получается 10000, но это выходит за размер разрядной сетки и переполнение отбрасывается, получается 0000.
SS : SP + 0 = SS : [ FFFE ] = 0000 - это значение поставляет сама ОСь, для сом-файлов, как защита самой себя.
SS : SP + 2 = SS : [ FFFE + 2 ]= SS : [0000] = CS : [0000] - указывает на префикс программы. Я уже показывал,что сегментные регистры равны. Как только Вы будете работать с ехе-файлами, равенство регистров пропадет и все станет на свои места:
CS - будет указывать на сегмент кода;
DS = ES - на префикс программы(так уж заведено, чтобы ОСь могла передать командную строку в программу и многое другое);
SS - на сегмент стека.

Удачи!
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

Форма ответа