19.10.2017, 00:58 [+3 UTC]
в нашей команде: 2 182 чел. | участники онлайн: 1 (рекорд: 21)

:: РЕГИСТРАЦИЯ

:: консультации

:: задать вопрос

:: все разделы

:: правила

:: новости

:: участники

:: доска почёта

:: форум

:: блоги

:: поиск

:: статистика

:: наш журнал

:: наши встречи

:: наша галерея

:: отзывы о нас

:: поддержка

:: руководство

Версия системы:
7.41 (25.02.2017)

Общие новости:
23.02.2017, 09:51

Форум:
18.10.2017, 22:13

Последний вопрос:
18.10.2017, 22:52

Последний ответ:
18.10.2017, 18:27

Последняя рассылка:
18.10.2017, 20:15

Писем в очереди:
0

Мы в соцсетях:

Наша кнопка:

RFpro.ru - здесь вам помогут!

Отзывы о нас:
28.06.2010, 16:09 »
Dimon4ik
Спасибо. На счет официального названия - я тоже думаю, что его нет. Так как тоже не находил. [вопрос № 179333, ответ № 262315]

РАЗДЕЛ • Assembler

Создание программ на языке Assembler.

[администратор рассылки: Лысков Игорь Витальевич (Старший модератор)]

Лучшие эксперты в этом разделе

Зенченко Константин Николаевич
Статус: Модератор
Рейтинг: 299
Лысков Игорь Витальевич
Статус: Старший модератор
Рейтинг: 169
Коцюрбенко Алексей aka Жерар
Статус: Мастер-Эксперт
Рейтинг: 88

Перейти к консультации №:
 

Консультация онлайн # 191462
Раздел: • Assembler
Автор вопроса: ialmiev (Посетитель)
Отправлена: 11.10.2017, 17:31
Поступило ответов: 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" ?

Спасибо.

Состояние: Консультация закрыта

Oтветов пока не поступило.

Мини-форум консультации № 191462

Зенченко Константин Николаевич
Модератор

ID: 31795

# 1

= общий = | 11.10.2017, 17:46 | цитировать цитировать  | профиль профиль  |  отправить письмо в личную почту пейджер
ialmiev:

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

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

• Отредактировал: Зенченко Константин Николаевич (Модератор)
• Дата редактирования: 11.10.2017, 17:47

Зенченко Константин Николаевич
Модератор

ID: 31795

# 2

= общий = | 11.10.2017, 17:53 | цитировать цитировать  | профиль профиль  |  отправить письмо в личную почту пейджер
ialmiev:

Буквально недавно это обсуждалось тут.

Лысков Игорь Витальевич
Старший модератор

ID: 7438

# 3

= общий = | 11.10.2017, 17:55 | цитировать цитировать  | профиль профиль  |  отправить письмо в личную почту пейджер
ialmiev:

Здравствуйте!
На самом деле, все очень просто smile
На самом деле, стек - это самая обычная память.
Для манипуляции со стеком есть сегментный регистр стека и указатель стека.
В модели 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
Вот и все smile

PS Константин Николаевич чуток опередил smile Но раз уж набрал... smile

=====
Каждый выбирает по себе -
Щит и латы, посох и заплаты.
Меру окончательной расплаты
Каждый выбирает для себя.

ialmiev
Посетитель

ID: 401339

# 4

= общий = | 11.10.2017, 20:16 | цитировать цитировать  | профиль профиль  |  отправить письмо в личную почту пейджер
Зенченко Константин Николаевич:

Уважаемые Константин Николаевич и Игорь Витальевич,
добрый вечер,

спасибо за ваши сообщения-консультации.
1) правильно ли я понимаю, что при ассемблировании ml.exe listing65.asm /AT происходит преобразование ассемблеровского файла, написанном на человекоподобном языке, на язык машинных кодов, 0100110 ...1111001 и т.д., то есть совокупность больших и малых напряжений в микроэлектронной памяти (черной микросхеме с ножками и ручками для поддержки) smile .
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", исполнялась бы и текстовая строка не выводилась бы на экран ? smile

Спасибо.

Лысков Игорь Витальевич
Старший модератор

ID: 7438

# 5

= общий = | 12.10.2017, 10:28 | цитировать цитировать  | профиль профиль  |  отправить письмо в личную почту пейджер
ialmiev:

В целом, все правильно smile
Вы делаете успехи smile

В пункте 5) немного уточню. Если SS не будет равен CS, то только тогда данная программа не сработает.
Мы же меняем команду, а не данные, поэтому содержимое DS и ES несущественно.
То же самое относится и к пункту 3г) Важно, что ss:0107 = cs:0107

=====
Каждый выбирает по себе -
Щит и латы, посох и заплаты.
Меру окончательной расплаты
Каждый выбирает для себя.

• Отредактировал: Лысков Игорь Витальевич (Старший модератор)
• Дата редактирования: 12.10.2017, 10:33

ialmiev
Посетитель

ID: 401339

# 6

= общий = | 13.10.2017, 09:08 | цитировать цитировать  | профиль профиль  |  отправить письмо в личную почту пейджер
Лысков Игорь Витальевич:

Уважаемый Игорь Витальевич,
добрый день,

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

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

спасибо за Ваше взаимопонимание.

Лысков Игорь Витальевич
Старший модератор

ID: 7438

# 7

= общий = | 13.10.2017, 12:32 | цитировать цитировать  | профиль профиль  |  отправить письмо в личную почту пейджер
ialmiev:

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

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

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

Вообще-то, в программировании гораздо более важнее логически мыслить и писать программы с оптимальным алгоритмом.

=====
Каждый выбирает по себе -
Щит и латы, посох и заплаты.
Меру окончательной расплаты
Каждый выбирает для себя.

ialmiev
Посетитель

ID: 401339

# 8

= общий = | 14.10.2017, 21:46 | цитировать цитировать  | профиль профиль  |  отправить письмо в личную почту пейджер
Лысков Игорь Витальевич:

Уважаемый Игорь Витальевич,
здравствуйте,

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

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

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

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

спасибо за Ваше взаимопонимание.

Зенченко Константин Николаевич
Модератор

ID: 31795

# 9

= общий = | 16.10.2017, 10:42 | цитировать цитировать  | профиль профиль  |  отправить письмо в личную почту пейджер
Лысков Игорь Витальевич:

Отвечать будете?

 

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

Яндекс Rambler's Top100

главная страница | поддержка | задать вопрос

Время генерирования страницы: 0.13682 сек.

© 2001-2017, Портал RFPRO.RU, Россия
Авторское право: ООО "Мастер-Эксперт Про"
Калашников О.А.  |  Гладенюк А.Г.
Версия системы: 7.41 от 25.02.2017
Бесплатные консультации онлайн