Консультация № 191231
19.07.2017, 14:35
0.00 руб.
1 37 1
Уважаемые эксперты! Пожалуйста, ответьте на вопрос:
Почему при записи в sp числа 109, меняется код по адресу 105 и 107? Приложение.

Прикрепленные файлы:
6b5670a9a45b80925e3d7eaa276b1cbc7c1e3aa0.png

Обсуждение

давно
Посетитель
7438
7205
19.07.2017, 15:25
общий
Так не я задаю этот адрес, ассемблер сам его вычисляет и подставляет
Так я и не говорю, что не будет работать. Будет. Просто такая работа удлиняет на такт работу с памятью.
Это так - на будущее... Для нашего примера - это неважно.
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Посетитель
401251
75
19.07.2017, 15:26
общий
Спасибо за ответы! с отладчиками более-менее разобрался.
давно
Старший Модератор
31795
6196
19.07.2017, 16:45
общий
Адресаты:
Цитата: Caesar
Смещение в sp указывает не на int 20h, а на mov ah, 09

В учебниках пишут, что команда push - заносит в стек слово и изменяет указатель стека. А вот как это делается умалчивается. На самом деле меняется(уменьшается) указатель стека и только потом число записывается в память.
Т.е. два nop'а будут записаны по адресу 0х0107, вместо int 20h.
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

давно
Старший Модератор
31795
6196
19.07.2017, 18:52
общий
это ответ
Здравствуйте, kveladze.kz!

Калашников и не рекомендует использовать отладчик.
Цитата: гл.№6
Попробуйте запустить ее под отладчиком. Вы увидите, что CodeView, TurboDebuger, AFD будут выдавать какой-то "мусор": непонятные операторы, сообщения типа "программа завершилась", хотя до команды int 20h дело не дошло (рис. 6.7). Но если запустить ее просто из DOS, то строка появится на экране, т. е. программа будет работать корректно, при этом выводя строку на экран (рис. 6.8)! Данный пример — типичный случай "заламывания рук" многим отладчикам.


Причина, в том, что отладчики используют стек программы для своих нужд. А когда как бы выполняется код программы - его чистят, как будто ничего и не было.

Если не то смещение то почему, процессор все равно затирает эту команду

В учебниках пишут, что команда push - заносит в стек слово и уменьшает указатель стека. А вот как это делается умалчивается. На самом деле уменьшается указатель стека и только потом число записывается в память по адресу SS : SP. Т.е. два nop'а будут записаны по адресу 0х0107, как раз вместо команды int 20h.

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

давно
Посетитель
401251
75
20.07.2017, 05:32
общий
Спасибо! Все встало на свои места
давно
Посетитель
401251
75
20.07.2017, 08:09
общий
команда push ax, занесла в стек 2 nop и как следствие, затерла int 20h.
Но int 20h не находится в стеке. Это как понимать?
Получается что push ax занесла запись не в стек, а по адресу, который был указан в стеке?




давно
Посетитель
401251
75
20.07.2017, 08:39
общий
Все разобрался вроде.
Вершина стека sp указывает на саму программу, т.е. командой mov sp, offset lab_1 мы перенесли стек в тело программы, так получается?
давно
Посетитель
7438
7205
20.07.2017, 09:54
общий
Адресаты:
Именно! После чего любая запись в стек портит код самой программы...
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Посетитель
7438
7205
20.07.2017, 11:52
общий
20.07.2017, 11:58
Адресаты:
Забегу немного вперед...
Подобные фокусы в защищенном режиме процессора (в программах для ОС Windows NT+, Linux) просто так не пройдут.
В них поддерживается защита сегментов памяти. Сегменты могут иметь разрешение на чтение, запись, выполнение.
Сегмент кода обычно можно только читать и выполнять. Попытка записи туда любым способом приведет к краху программы
Хотя всегда есть возможность настроить, например, тот же стек так, что он будет совмещен с сегментом кода. И тогда все будет работать...
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Посетитель
401251
75
20.07.2017, 12:00
общий
Спасибо за инфу, я ее запомню!!!
Но я пока даже, что такое защищенный режим процессора не знаю)

давно
Посетитель
7438
7205
20.07.2017, 12:20
общий
Адресаты:
Я ознакомился с защищенным режимом в далеких уже 90-х годах по книжке Фроловых
Где-то до сих пор валяется бумажная книжка... Если интересуешься, то это весьма захватывающее чтиво.
То, что сейчас изучаете, называется реальный режим процессора... В 8086 это был единственный режим.
Короче, Вы в начале чрезвычайно интересного пути! Грызите камень науки!
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Посетитель
401251
75
20.07.2017, 14:30
общий
20.07.2017, 14:34
Калашников
Максимальное количество одновременно открытых файлов указывается в переменной FILES=XX файла config.sys, где XX — число не более 99. MS-DOS резервирует для каждого файла определенное количество байтов памяти

В Windows 7 есть такой файл, также одна строчка, изменил с 40 на 1, ничего не произошло.
Почему?

И что должно было произойти? (Я мог бы открыть только один документ или одну папку или одно приложение). В смысле один файл? что под этим понимается?
давно
Посетитель
7438
7205
20.07.2017, 14:57
общий
Адресаты:
В Windows NT+ этот файл не используется.
Полагаю, он оставлен для совместимости с досовскими программами.
Хочу отметить, что в ДОС есть 5 заранее открытых "файлов"- устройств, поэтому необходимо задавать больше 5,
все, что свыше, есть максимальное количество одновременно открытых пользовательских файлов. Именно файлов.
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Посетитель
401251
75
20.07.2017, 14:59
общий
Как пользоваться отладчиком, чтоб когда попадались прерывания, после их выполнения не выкидывало в какую - то другую область (где не мой сегмент кода)?
А то пока идут команды я нажимаю f1, а на прерывании я нажимаю стрелкой вниз. При прерываниях меняются флаги, после прерывания 16h функции 10, хотелось бы посмотреть на изменения в регистре.
давно
Посетитель
401251
75
20.07.2017, 15:02
общий
Цитата: Лысков Игорь Витальевич
максимальное количество одновременно открытых пользовательских файлов. Именно файлов.

т.е. любых файлов (.exe, .jpg, .doc, .txt и т.д.) в "совокупности" максимальное число?
давно
Посетитель
7438
7205
20.07.2017, 15:19
общий
Адресаты:
т.е. любых файлов (.exe, .jpg, .doc, .txt и т.д.) в "совокупности" максимальное число?
ОДНОВРЕМЕННО открываемых файлов. Т.е. если программа открывает файлы, то не сможет одновременно открыть больше, чем разрешено.

Открыть, потом закрыть, снова открыть не считается. В данном случае, в каждый момент времени открыт всего один файл.

Такая проблема сказывалась, в свое время, когда использовалась база данных, работающая с файлами dbf. Обычно в базе было довольно много файлов и которые СУБД открывало все сразу. По умолчанию, насколько помню, было FILES=20. Ставили FILES=60 и все работало.
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Посетитель
401251
75
20.07.2017, 15:30
общий
Как так ОДНОВРЕМЕННО открываемых? Процессор в один момент делает одно действие. Один такт - одно событие. Следовательно в каждый момент времени и открыт один файл, как не крути. Может я туплю по не знанию.
Я понял так. Вот например я поставил максимум 1 и открыл один документ , так вот пока он открыт я не могу ничего другого открыть (ни приложения, ни картинки ....)?
Так получается?
давно
Посетитель
7438
7205
20.07.2017, 15:30
общий
Адресаты:
Как пользоваться отладчиком, чтоб когда попадались прерывания, после их выполнения не выкидывало в какую - то другую область (где не мой сегмент кода)? А то пока идут команды я нажимаю f1, а на прерывании я нажимаю стрелкой вниз. При прерываниях меняются флаги, после прерывания 16h функции 10, хотелось бы посмотреть на изменения в регистре.
В отработке прерываний обычно участвует не одна программа, а их цепочка. Т.е. первой получает управление та, на которую показывает вектор. Она обычно проверяет, надо ли ей что-то делать, если надо, делает и передает управление следующей программе по цепочке. Если ничего не надо делать, то сразу передает управление дальше. Это значит что при установке своего отработчика прерывания необходимо сохранить старый вектор в двойном слове, как длинный адрес и делать длинный переход по тому адресу, когда надо закончить свою работу.

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

А чтобы сразу попасть на свой отработчик, проще всего установить в нужном месте точку останова, как int 3
Некоторые ассемблеры превращают команду в 0cdh 03h, что неверно, надо 0cch. поэтому я уже давно, на автомате ставлю 0dbh 0cch
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Посетитель
401251
75
20.07.2017, 15:37
общий
А где находится это нужное место? Перед прерыванием?
0dbh 0cch это заместо int 3?
давно
Посетитель
401251
75
20.07.2017, 15:38
общий
И куда это записать? в стек? или в какой-то регистр?
давно
Посетитель
7438
7205
20.07.2017, 15:44
общий
Адресаты:
Как так ОДНОВРЕМЕННО открываемых? Процессор в один момент делает одно действие. Один такт - одно событие. Следовательно в каждый момент времени и открыт один файл, как не крути
Процессор тут не при чем. Он выполняет код, он к файлам не имеет никакого отношения

Для всех открытых файлов в ДОСе жестко выделялся массив памяти. Один элемент под один файл. Элемент представляет собой структуру данных, в элементах которой хранилась необходимая информация о файле, как то начальный кластер файла на диске, длина файла, текущий указатель в файле и многое другое. При открытии какого-файла некоторый элемент связывался с этим файлом, в программу возвращался индекс связанного элемента. При всех файловых операциях данный индекс (называется еще описатель файла, handle) обязательно передавался в регистре BX. При закрытии файла буфера записывались на диск, заполнялась запись в оглавлении и... освобождалась структура элемента. Готовая к открытию следующего файла.

Так как таких структур ограниченное число, потому одновременно можно было открыть не более указанного количества.
Вот такая внутренняя суть работы с файлами. Я когда-то даже смотрел код ДОСаБыло дело...
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Посетитель
7438
7205
20.07.2017, 15:46
общий
Адресаты:
А где находится это нужное место? Перед прерыванием?
В том месте, где надо остановиться. После чего запускаем на работу под отладчиком (под AFD команда g) Отладчик остановится на команде int 3
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Посетитель
7438
7205
20.07.2017, 15:50
общий
Адресаты:
0dbh 0cch это заместо int 3?
Команда int 3 является однобайтовой и имеет код 0cch
В отличие от всех остальных, которые двубайтовые и имеют код 0cdh xx

Командой 0dbh 0cch мы явно вписываем байт данных 0cch, что является кодом int 3
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Посетитель
7438
7205
20.07.2017, 15:52
общий
И куда это записать? в стек? или в какой-то регистр?
В текст программы, в том месте, где хотим остановиться под отладчиком.
Компилируем, запускаем под отладчиком и наблюдаем.
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Посетитель
401251
75
20.07.2017, 15:55
общий
Минуточку я все обмозгую)
давно
Посетитель
7438
7205
20.07.2017, 15:56
общий
По сути, команда int 3 - команда пошаговой отладки. Отладчик ее также использует, когда (в AFD) нажимаем на F1
Остановиться в нужном месте можно и по-другому: запустить на работу командой g start,break. Где start - hex-адрес старта, а break - адрес останова.
Кстати, у AFD есть справка по клавише f4
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Посетитель
401251
75
20.07.2017, 15:58
общий
Цитата: Лысков Игорь Витальевич
Кстати, у AFD есть справка по клавише f4


Да я видел, с английским пока туго ((
давно
Посетитель
401251
75
20.07.2017, 16:15
общий
Я не правильно изначально свой вопрос сформулировал! Я хотел узнать про:
Цитата: Лысков Игорь Витальевич
Отладчик ее также использует, когда (в AFD) нажимаем на F1


вот к примеру код:
[code lang=asm] mov ax,21
mov bx, 72
add ax, bx
mov ah,9h
mov dx, offset Mes
int 21h
mov bx, 72
add ax, bx[/code]

нажимаем F1 еще раз F1... и вот дошли до прерывания "int 21h" нажимаем опять F1 после этого код следующий за прерыванием меняется (с этим Вы мне помогли разобраться) как мне продолжить выполнение моего кода.
Т.е. Я хочу начинать программу не с того места где уже прерывание закончилось, а просмотреть всю программу, не уходя в дебри кода прерывания?
Надеюсь Вы меня поняли?
По крайней мере "Я сам себя понимаю")))))))))
давно
Посетитель
7438
7205
20.07.2017, 16:31
общий
Адресаты:
Кроме кнопки F1 есть еще кнопка F2, которая не заходит во внутрь прерываний и вызовов подпрограмм
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Посетитель
401251
75
21.07.2017, 05:36
общий
Все так просто!
Форма ответа