Консультация № 193905
14.11.2018, 20:25
0.00 руб.
0 6 0
Уважаемые эксперты, здравствуйте !

Пожалуйста, ответьте на вопросы по Листингу 10.4 из книги О.А.Калашникова

1) насколько я понимаю, запись "mov word ptr Int_21h_vect,bx" просто означает wrapping, то есть переменная Int_21h_vect имеет размер в 4 байта (32 бит), а регистр bx имеет размер в 2 байта (16 бит), и, чтобы записать (точнее согласованно, то есть правильно, без ошибок на микроэлектронном уровне записать) 2-х байтный регистр bx (точнее его содержимое, то есть значение) по адресу, где находится (занимает микроэлектронное пространство) 4-х байтная переменная Int_21h_vect, как раз и используется указанная выше запись, то есть: "mov word ptr Int_21h_vect,bx", где по-Английски это можно описать как: move a value of 2-byte (word) register bx, that is pointed to the address of Int_21h_vect variable. правильно ли я понимаю данную запись ?

2) запись "mov word ptr Int_21h_vect+2,es" мне станет понятной, если Вы сможете мне ответить на 1)-вопрос.

3) мне не понятно выражение "перехватить (!!!) прерывание". можно ли для моего понимания немного переформулировать данное выражение, то есть, например, строки просто означают:

mov ax,2521h
mov dx,offset Int_21h_proс
int 21h

что необходимо в таблице векторов прерываний (из Интернета я немного разобрался, что такое таблица векторов (точнее, es:dx-адресов) прерываний) заменить адрес высокоуровневого прерывания "int 21h" на адрес обработчика (точнее, определенной процедуры Int_21h_proс) прерывания, написанного-разработанного программистом ?

Спасибо.

Обсуждение

давно
Посетитель
401339
51
16.11.2018, 17:15
общий
Адресаты:
Уважаемые Константин Николаевич и Игорь Витальевич,
здравствуйте,

1) я зарегистрировался на Вашем сайте вот уже один год тому назад.

2) примерно 7-8 месяцев тому назад я купил печатную версию книги О.М.Калашникова - печатная версия любой книги намного лучше чем электронные версии (pdf или djvu), берешь читаешь-перечитываешь по нескольку раз одни и те же абзацы, и начинаешь понимать суть дела, да и детали тоже. полагаю, что вы тоже со мной согласны в этом - от компьютерных книг (электронных версий) устают и болят глаза, поднимается давление.

3) с сентября 2017 года я делал две попытки освоить Ассемблер МАSМ быстро-быстро - быстро читал, копировал примеры (листинги) из книги О.М.Калашникова, которые как-будто бы работали - доходил до примерно 4-6 глав и уже ничего не понимал по Ассемблеру - терялась всякая логика и даже программистское воображение.

Константин Николаевич и Игорь Витальевич, вы совершенно правы - я много захотел, и ничего не получил (никаких фундаментальных знаний по Ассемблеру), боле того, я поспешил и людей насмешил - наверное вы оба смеялись надо мной, что я выгляжу таким недотепой и малограмотным (дуб есть дуб).

4) в октябре 2018 года я сделал другую попытку освоить хотя бы начальные основы Ассемблера, но использовал совершенно другой подход - читал и анализировал (!!!) каждое предложение Частей 1-ой и 2-ой и начала 3-ей из книги О.М.Калашникова - как научного сотрудника это меня потянуло вспомнить и заново переучить Цифровую электронику (Логику Карно, логические схемы-элементы, триггеры, ЦАП-АЦП, RAM-ОЗУ ... ) и немного Аналоговой электроники (в том числе полупроводниковые приборы) - это в свою очередь потянуло меня вспомнить (из Интернета - книги, статьи) из моей прошлой жизни физику твердого тела, электронику (металы, диэлектрики, полупроводники), и электродинамику и численные методы и т.д. в том числе программирование на Си и на Фортране.
более того я досконально и детально анализировал и запоминал наизусть примеры-Листинги из книги О.М.Калашникова, потом программировал их - потом старался забыть их - и уже потом программировал данные примеры-Листинги заново, но только зная конечную цель этих примеров-Листнигов - все это получалось и было очень интересно и познавательно.

5) эффект от такого подхода изучения Ассемблера - абсолютно другой - очень хороший и положительный - по крайней мере я немного уже "вижу" (представляю), что происходит на микроэлектронном уровне, когда я программирую на Ассемблере и запускаю com-файлы. более того, мне уже чуть-чуть легче именно (!!!) программировать и экспериментировать (с помощью также AFD Pro) на Ассемблере - пусть даже примеры-Листинги.

6) однако у меня возникли и возникают много вопросов и по MASM, и по микроэлектронике, и по радиоэлектронике, и по физике (макро и квантовой) в смысле разработки радиоэлектронной, и микроэлектронной аппаратуры - в принципе там ничего сложного нет - надо только находить ответы на все вопросы - это занимает время и ... в современных России и Украине нужны для этих целей очень (!!!) большие деньги - вы сами лучше меня понимаете, что Советского Союза - СССР уже нет и не будет.

7) теперь, что касается MASM - меня заинтересовало выражение "перехватить прерывание" - как человек работавший в прошлой своей жизни с чужими кодами (Си, Фортран-77) и как научному сотруднику для ответа на свой же вопрос мне нужно знать все (!!!) о низко-уровненвых (!!!) реализациях высоко-уровненых прерываний, которые в MASM описываются командой (инструкцией) "int ..." - то, что в MS-DOS есть таблица прерываний - это мне не достаточно знать и в принципе это мне ни о чем не говорит - то есть необходимо знать кто, каким образом, на каких компьютерах, в каких операционных схемах, и на каких языках, и всю радиоэлектронную систему (basis and equipment, то есть как программировали (вшивали) и "вшивают" низко-уровневую реализацию команд в черные микросхемы (с ножками) - BIOS, UEFI, микроконтроллеры, БИС-СБИС - для этого необходимо напрямую разговаривать и общаться именно и разработчиками, например, MASM, или FASM, или NASM (64-битная вресия).

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

9) Константин Николаевич, насколько я помню Вы являетесь профессиональным радиоэлектронщиком. я ведь являюсь Вашим коллегой (в младшем разряде) - мне удалось закончить первые 3 курса на отделении радиофизики и радиоэлектроники на физфаке КГУ в Казани, потом конечно я специализировался по компьютерному моделированию в квантовой физике, и затем, и в атомной и лазерной физике. вот поэтому я Вас очень хорошо понимаю в смысле радиоэлектроники и программирования.

10) Константин Николаевич и Игорь Витальевич, с учетом выше сказанного я не (!!!) планирую торопиться с освоением вирусологии и программирования файловой оболочки из книги О.М.Калашникова, то есть не торопиться.
Константин Николаевич и Игорь Витальевич - наверное вы со мной согласитесь, что чтобы сделать значительный прогресс в Народном Хозяйстве РСФСР и УССР - и я, и вы оба должны знать все (!!!) - начиная от квантовых процессов в твердых телах и от процесса именно разработки радио- и микро-электронной техники и вплоть до НИЗКО-уровневого программирования черных микросхем (с ножками), а затем уже ВЫСОКО-уровневая разработка Ассемблеров и дальше уже разработка (и программирование) Операционных систем, драйверов и различных компиляторов языков программирования и т.д.
Константин Николаевич и Игорь Витальевич - MASM, да и FASM и NASM (64-битный) - это ВЫСОКО-уровневые Ассемблеры.
я уверен на 97-99 процентов, что в таких компаниях как INTEL и IBM применяются и используются другие, НИЗКО-уровневые Ассемблеры и вероятно Операционные Коды (opcodes) тоже, которые были разработаны еще в 1960-80-х годах по заказу и финансированию Пентагона в США.

пока все.
всего наилучшего, и удачи вам.
давно
Посетитель
7438
7205
16.11.2018, 18:10
общий
Адресаты:
И Вам всего наилучшего! Столько всего написали...
Мой Вам совет: не пытайтесь объять необъятное... Вы собрались разрабатывать процессор? Зачем Вам вникать, как это реализовано в процессоре. Зачем терять на это время?
Изучайте то, что можно использовать при написании программ. Поверьте мне, тут достаточно много информации.

Давайте лучше разберем Ваши вопросы:
1,2) Прежде всего, я призываю не оперировать "микроэлектронным уровнем". А, исключительно, логическим. Для Вас должно быть совершенно безразлично, как все реализовано на "микроэлектронном уровне". Поэтому фразу
чтобы записать (точнее согласованно, то есть правильно, без ошибок на микроэлектронном уровне записать) 2-х байтный регистр bx (точнее его содержимое, то есть значение) по адресу, где находится (занимает микроэлектронное пространство) 4-х байтная переменная
я бы сказал так: "чтобы сказать компилятору, что по адресу, описанному, как DWORD, будет записан WORD". А так все правильно

3) тут тоже понимаете правильно.
Для лучшего понимания скажу еще пару слов:
Все правильно, имеется таблица длинных адресов отработки прерываний, их еще называют вектора прерываний.
Когда проиисходит прерывание, аппаратное или программное, без разницы, автоматически происходит сохранение в стеке регистра флагов и длинный адрес команды, которая не выполнилась. Чтобы после выхода из прерывания работа продолжилась с этой самой команды...

В системе (мы говорим, для определенности, о ДОС) до запуска нашей программы уже есть некие обработчики всех прерываний. Причем, эти обработчики строятся, как цепочка обработчиков. Самый верхний, получив управление, проверяет, надо ему что-то сделать или нет. Если надо, то делает и выходит, а может, сделав, и передать управление дальше. Если не надо ничего делать, то просто отдает управление дальше. И так, вплодь до самого "дна", до системных обработчиков.

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

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

1) пожалуйста, скройте все мои сообщения (начиная от даты моей регистрации на Вашем Форуме) от их появления в открытом Интернете (Google, Yandex, Mail.ru, Yahoo и т.д.).

2) спасибо за Ваши теплые слова, и Ваше понимание.

3) я посетил Украину в 1980 и 1981 годах когда с моими родителями мы ездили на Юг к Черному морю - Крым, Одесса, Харьков ... и также мне удалось проезжать через Украину на поезде в 1988 году, когда я ехал во Всесоюзный пионерский лагерь Артек.
с тех пор у меня остались самые теплые воспоминания об Украинской ССР. самое главное - это очень теплое гостепреимство Украинских людей в те Советские времена, а также аисты на крышах красивых белых хат (частных домов). Вы понимаете (?), что в 1988 году килограмм черешни на Украине стоил всего лишь примерно 10-15 копеек !!! да и ящик алычи и персиков можно было купить в Одессе примерно за 2-3 рубля. Вы помните (?) сельхоз поля в Украинской ССР, где росли очень большие подсолнухи с большими семечками ? это было Золотое время в нашей стране - поверьте мне.

4) у меня ведь остались друзья по Артеку на Украине. я не знаю, как сложилась их судьба, особенно после развала СССР в 1991 году - очень надеюсь, что они смогли получить высшее образование и устоять против нищеты и голода в 1990-х годах в странах-республиках экс-СССР.

5) ну, хорошо, теперь ближе к делу - а Вы знаете, почему таблица прерываний еще называется векторами (!!!) прерываний. ответ очень-очень простой - каждое прерывание (набор "0" и "1"битов, составляющих несколько байтов) характеризуется, как Вы хорошо знаете, логическим (!!!) адресом - (сегмент, смещение), то есть логический адрес характеризуется двумя числами. в школьном курсе Геометрии такие два-числа рисуются как векторы на плоскости. вот поэтому и "таблица векторов (!) прерываний". почему именно так ? ну очевидно кому-то из разработчиков MASM и Intel 8086 микропроцессора в США захотелось провести именно такую аналогию. к большому сожалению Американские люди думают и мыслят совершенно по разному в отличии от Советских людей.

6) теперь, выражение "перехватить прерывание" мне стало понятным - спасибо.

7) на счет, книги О.М.Калашникова - не беспокойтесь - я ее продолжаю изучать (3-ю часть), но немного медленнее, чем 1-ю и 2-ую части, так как я хочу не копировать Листинги-примеры и на шару их тестировать в AFD Pro - а понять (!!!) и выучить как именно они работают (функционируют) - в этом ничего сложного нет - если возникнут вопросы я попытаюсь поискать ответы в Интернете и затем спросить Вас и Константина Николаевича на данном Форуме - спасибо.

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

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

Спасибо еще раз.
давно
Посетитель
401339
51
17.11.2018, 20:20
общий
Адресаты:
Уважаемый Игорь Витальевич, Константин Николаевич и эксперты,
здравствуйте,

у меня возникли дополнительные вопросы по Листингу 10.4 из книги О.М.Калашникова,

1) эти строки мне понятны - в них записывается адрес (сегмент и смещение) прерывания int 21h,

mov word ptr Int_21h_vect,bx
mov word ptr Int_21h_vect+2,es

2) в процедуре Int_21h_proc есть строки,

Ok_09:
push ds
push dx

push cs
pop ds

mov dx,offset My_string

pushf

call dword ptr cs:[Int_21h_vect]

pop dx
pop ds
iret

а) зачем в стек записывать ds ? - ведь этот регистр не меняется в com-программе.

б) dx записывается в стек, так как он изменяется - а в принципе зачем и его необходимо записывать в стек ?

в) зачем (?) необходимо перезаписывать (на самом деле пере-копировать) ds и cs регистры - используя команды:
push cs
pop ds

г) что означает запись: call dword ptr cs:[Int_21h_vect] ?
ведь команда "call" используется только (?) для вызова подпрограмм (Глава 5).
(ранее я не сталкивался в книге с такой записью).

д) зачем необходимо использовать команду "pushf" (записать флаги в стек) - ведь флаги не изменяются ?

е) зачем необходимо использовать команду "iret" (возврат из прерывания), а нет просто "ret" ?

пока все.
Спасибо.
давно
Посетитель
401339
51
18.11.2018, 16:47
общий
18.11.2018, 16:47
Адресаты:
Уважаемые Игорь Витальевич и Константин Николаевич,
здравствуйте,

1) позвольте поблагодарить вас еще раз за ваши ответы на мои вопросы, которые я задавал на Форуме в прошлом.

2) однако я не достиг своей главной цели, даже хотя бы не смог наметить план действий.

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

4) Игорь Витальевич, Вы упомянули "разработку микропроцессора", и как я уже отметил, это очень интересная тема в науке и технике - на Украине (УССР) этой темой занимались, если я не ошибаюсь, уже с 1950-60-х годов. к сожалению, я не знаю современное состояние этих разработок ни на Украине, ни в России - я никакого отношения к людям из Москвы и Зеленограда не имею.

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

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

5) что касается моего участия в обучении MASM, то я возьму тайм-аут , так как очень уж много возникает вопросов, а ответы на них должны быть понятными мне и простыми в трактовке (в научном смысле).

Удачи вам,
и еще раз спасибо за ваши ответы на мои вопросы на вашем Форуме.
давно
Посетитель
7438
7205
19.11.2018, 12:24
общий
Адресаты:
Только увидел Ваши вопросы. Все они вызваны непониманием, как все работает...
Итак:
а) зачем в стек записывать ds ? - ведь этот регистр не меняется в com-программе.
Разве не меняется? А push cs вместе с pop ds к чему приведет?
Только вот зачем так делается?
А затем, что:
1) функция 9 прерывания 21h ожидает адрес выводимой строки в DS:DX
2) При входе в прерывание действительным является только значение DS
Дальше думайте самостоятельно...

б) dx записывается в стек, так как он изменяется - а в принципе зачем и его необходимо записывать в стек ?
Да чтобы не испортился адрес ориганьной строки. Мы же хотим вывести свою строку, так ведь?

в) зачем (?) необходимо перезаписывать (на самом деле пере-копировать) ds и cs регистры - используя команды:
push cs
pop ds
Смотри ответ на вопрос а)

г) что означает запись: call dword ptr cs:[Int_21h_vect] ?
ведь команда "call" используется только (?) для вызова подпрограмм (Глава 5).
(ранее я не сталкивался в книге с такой записью).
Чтобы вызвать предыдущий обработчик прерывания, адрес которого мы сохранили.
Прерывание - та же подпрограмма.

д) зачем необходимо использовать команду "pushf" (записать флаги в стек) - ведь флаги не изменяются ?
В продолжение вопроса г) Отличие вызова подпрограммы от явного вызова вектора прерывания в том,
что при вызове вектора прерывания необходимо предворительно сохранить в стеке флажки.
Прерывания заканчиваются командой iret, которая эти флажки восстанавливает из стека.

е) зачем необходимо использовать команду "iret" (возврат из прерывания), а нет просто "ret" ?
В продолжение вопроса д). Мы же пишем отработчик прерывания, а не просто подпрограмму.
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
Форма ответа