Консультация № 191462
11.10.2017, 17:31
0.00 руб.
0 9 0
Уважаемые эксперты! Пожалуйста, ответьте на вопросы:

глава 6 и листинг 6.5 из книги О.А.Калашникова,
в интернете нашел объяснение, что затираются байты "CD-20" - пока мне это не понятно, хотелось бы узнать детальнее работу стека.

Код:
	
mov sp,offset lab1
mov ax,9090h
push ax

int 20h

lab1:
mov ah,9
mov dx,offset message1
int 21h

int 20h


1) стэк - это кратковременная (микроэлектронная) память в самом процессоре ?
2) я понимаю, что стэк работает по принципу первый зашел и последний вышел, и наоборот - последний зашел, первый вышел. данная программа (листинг 6.5) тоже загружается в память поочередно - байт-за-байтом.
3) при помощи команды "М1" я определил, что первая команда (прерывание-библиотека) int 20h описывается компьютерной инструкцией-командой (двоичный или шестнадцатиричный код) CD 20, но эта команда не находится же в стеке, а находится в ОЗУ ... или же вся ассемблеровская программа, будучи запущенной как com-файл, находится (когда исполняется) все-таки в стэке процессора ?
4) хорошо, команда "mov sp,offset lab1" ничего принципиального не говорит - а просто говорит, что адрес текстовой строки "lab1" заносится в SP-регистр,
5) команда "mov ax,9090h = mov ah,90h, mov al,90h" мне понятна - два байта - то есть две команды NOP занимают два байта подряд и заносятся в регистр AX,
6) затем эти два (подряд) байта заносятся в стэк, то есть во временную микроэлектронную память в самом процессоре (команда push ax),
7) почему и с какой стати, эти два байта подряд затирают инструкцию-команду "CD 20", которая находится на самом деле не в стеке, а в ОЗУ ? да еще и "находят" и записываются по адресу команды-прерывания "int 20h" ?

Спасибо.

Обсуждение

давно
Старший Модератор
31795
6196
11.10.2017, 17:46
общий
11.10.2017, 17:47
Адресаты:
1) Сам стек определяется регистрами SS : SP, т.е. он находится в памяти ОЗУ, а не в процессоре.
2) да.
3)см 1.
4) команда говорит, что изменился указатель стека.
5) да.
6) см.1
7) команда push работает в два этапа, SP:=SP-2 и MOV SS:[SP],reg

И вообще, работа этого кода показывает один из приемов борьбы с отладчиками.
Без отладчика код работает, а в ЛЮБОМ отладчике вылетает.
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

давно
Старший Модератор
31795
6196
11.10.2017, 17:53
общий
Адресаты:
Буквально недавно это обсуждалось тут.
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

давно
Посетитель
7438
7205
11.10.2017, 17:55
общий
Адресаты:
Здравствуйте!
На самом деле, все очень просто
На самом деле, стек - это самая обычная память.
Для манипуляции со стеком есть сегментный регистр стека и указатель стека.
В модели Tiny, в которой Вы сейчас пишите программки, все сегментные регистры указывают на один и тот сегмент памяти.
А значит, возможны подобные "фокусы".

Как работает стек?
Регистр вершины стека SP указывает на слово (мы говорим сейчас о 16-битном режиме процессора) ЗА адресом, куда будет писаться следующее значение. При записи в стек происходит уменьшение значения SP на 2 и запись по адресу SS:SP. При извлечении из стека происходит чтение по адресу SS:SP и увеличение SP на 2.

Чем удобен стек?
Например, работает подпрограмма. По ходу дела вызывается другая. При этом, адрес следующей команды прерванной заносится в стек, загружается адрес вызванной. По завершению которой извлекается адрес возврата из стека. Так работают и прерывания. При вызове подпрограмм часто параметры загружают в стек, по возвращению параметры оттуда удаляются. И, наконец, в стеке можно временно сохранять какие-то переменные.

Вернемся к нашему примеру. Что получилось?
Командой mov sp,offset lab1 мы загрузили в регистр вершины стека адрес в сегменте кода (не забываем, что в модели Tiny все сегменты равны!), равный адресу ЗА командой int 20h.
Далее, командой push ax мы записали ПЕРЕД адресом lab1 две команды nop (ее код 90h), тем самым затерли int 20h
Вот и все

PS Константин Николаевич чуток опередил Но раз уж набрал...
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Посетитель
401339
51
11.10.2017, 20:16
общий
Адресаты:
Уважаемые Константин Николаевич и Игорь Витальевич,
добрый вечер,

спасибо за ваши сообщения-консультации.
1) правильно ли я понимаю, что при ассемблировании ml.exe listing65.asm /AT происходит преобразование ассемблеровского файла, написанном на человекоподобном языке, на язык машинных кодов, 0100110 ...1111001 и т.д., то есть совокупность больших и малых напряжений в микроэлектронной памяти (черной микросхеме с ножками и ручками для поддержки) .
2) затем, когда мы запускам com-файл, нажатием клавиши Enter, программа пересылается по шине из ПЗУ (жесткий диск) в ОЗУ и дальше пересылается в микропроцессор на исполнение ?
3) далее для данного 6.5 листинга или модели tiny происходят "фокусы" в микроэлектронном мире, а именно:
а) все регистры указывают на один и тот же (!) сегмент памяти ОЗУ,
б) значит, стек физически совпадает с сегментом кода и сегментом данных,
в) следовательно, так как команда (как вы объяснили) "push" работает в два этапа:
i) sp:=sp-2;
ii) mov ss:[sp],reg;
то происходит sp=0109-0002=0107 и запись в память по адресу ss:[sp]=ss:0107 (!) данных из регистра AX.
г) а так как для модели com-файлов (или tiny в TASM) - ss=ds=cs=es, то ss:0107 = ds:0107, а это и есть логический адрес в ОЗУ, где и находится первая команда "int 20" в листинге 6.5.
д) в результате двух-этапная команда "push ax" и затирает первую команду "int 20".
4) правильно ли понимаю-рассуждаю в а)-д) пункта 3) моих рассуждений-вопросов ?
5) правильно ли я понимаю, что если бы регистр SS указывал бы на другое число-адрес (страницы) в ОЗУ, которое бы отличалось и от CS, и от DS, и от ES, то код-листинг 6.5 наверное работал бы корректно, то есть первая команда выхода в DOS-систему "int 20", исполнялась бы и текстовая строка не выводилась бы на экран ?

Спасибо.
давно
Посетитель
7438
7205
12.10.2017, 10:28
общий
12.10.2017, 10:33
Адресаты:
В целом, все правильно
Вы делаете успехи

В пункте 5) немного уточню. Если SS не будет равен CS, то только тогда данная программа не сработает.
Мы же меняем команду, а не данные, поэтому содержимое DS и ES несущественно.
То же самое относится и к пункту 3г) Важно, что ss:0107 = cs:0107
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Посетитель
401339
51
13.10.2017, 09:08
общий
Адресаты:
Уважаемый Игорь Витальевич,
добрый день,

спасибо за Ваше сообщение и комплимент (это я насчет "... делаете успехи"). однако, мне еще многому чему надо учиться по различным Ассемблерам (для PC, Apple, микроконтроллеров, и т.д.), схемотехнике и радиоэлектронике, чтобы реально понимать, что именно происходит в "железе" (hardware) и чтобы научиться разрабатывать радиоэлектроннное "железо" (пусть даже простое-элементарное, но свое - и начать это с обычного фундамента-базиса: полупроводники, диоды, транзисторы, простые схемы на транзисторах и диодах и т.д.) и программировать его. у меня есть интерес к этому.

Игорь Витальевич, к сожалению моя специальность - компьютерное моделирование в атомной (квантовые электронные переходы в атомах) и лазерной физике - является не востребованной (и высокая конкуренция тоже имеется) в современной России и на Западе, и поэтому я вынужден искать пути приложения своих научных знаний и опыта в других областях техники. в дальнейшем мне хотелось бы заняться разработкой и программированием радиоэлектронного "железа" (hardware). для этого я и хотел бы освоить Ассемблеры (Windows, Linux, Unix, микроконтроллеры и т.д.), схемотехнику, радиоэлектронику и микроэлектронику с азов, то есть с фундамента-базы.

спасибо за Ваше взаимопонимание.
давно
Посетитель
7438
7205
13.10.2017, 12:32
общий
Адресаты:
Здравствуйте!
Раз хотите работать с железом, то рекомендую посмотреть на микроконтроллеры, например, на семейство AVR или ARM.
Классические компьютеры - это "числодробилки", для непосредственного управления не годятся.
Разве что, передавать некоторую информацию на исполнительное устройство.

Я сейчас как раз занимаюсь программированием контроллеров, больше AVR.
Для AVR пишу исключительно на Ассемблере, для ARM-ов совмещаю Си и Ассемблер
На компьютере пишу только настроечные программы для устройств.

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

Вообще-то, в программировании гораздо более важнее логически мыслить и писать программы с оптимальным алгоритмом.
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Посетитель
401339
51
14.10.2017, 21:46
общий
Адресаты:
Уважаемый Игорь Витальевич,
здравствуйте,

спасибо за Ваше сообщение и ценные советы по поводу AVR и ARM микроконтроллеров.

действительно, я хотел бы научиться сам программировать микроконтроллеры и другое произвольное "железо" и сам же разрабатывать радиоэлектронные схемы - аналоговые и цифровые. однако, как и в любой деятельности-творчестве необходимо начинать с простых вещей - вспомнить вузовский курс по общей физике и математике - и не стесняться того, что многое уже сейчас забыто - просто надо почитать книги по соответствующим предметам и вспомнить вузовские лекции. и надо делать это постепенно-последовательно - иначе в голове будет "каша".

для начала я ухватился за Ассемблер MASM, так как имею книгу О.А.Калашникова в качестве учебника (manual). в дальнейшем мне предстоит вспоминать общий курс физики по электричеству и магнетизму - вспомнить и самому выводить формулы - это нужно новичкам по "железу" для того чтобы оттачивать свои мозги и научиться (точнее переучиться) в дальнейшем думать на радио- и микро-электронном уровнях. опять же, вся эта работа над собой для новичков должна происходить последовательно-постепенно, то есть, как говорили в старину - "не надо торопить события".

Игорь Витальевич, к сожалению в современное время на территории экс-СССР происходит развал экономик - то есть по проще говоря - у обычных простых (а не долларовых миллионеров и миллиардеров) граждан экс-СССР зарплаты очень-очень маленькие, а цены на товары и услуги потребления очень-очень дорогие. поэтому, в частности, цены на печатные книги и радиодетали и радиоприборы очень-очень высокие-дорогие. поэтому приходится учиться на тех книгах и софте, которые можно загрузить в Интернете.

спасибо за Ваше взаимопонимание.
давно
Старший Модератор
31795
6196
16.10.2017, 10:42
общий
Адресаты:
Отвечать будете?
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

Форма ответа