Уважаемые Константин Николаевич и Игорь Витальевич,
добрый вечер,
спасибо за ваши сообщения-консультации.
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", исполнялась бы и текстовая строка не выводилась бы на экран ?
Спасибо.