- •1)Блочная структура программы: внутренние и внешние процедуры
- •3) Блочная структура программы: расположение процедур в исходном файле
- •4) Использования прерываний в ассеемблер-программах
- •5)Команды передачи управления: безусловные переходы. Адресация в переходах
- •6) Команды передачи управления: организация циклов
- •7) Команды передачи управления: условные переходы
- •8) Команды сдвигов и их использования
- •13. Место языков ассемблера среди языков программирования.
- •14. Модели памяти и их использования в tasm.
- •16. Передача параметров между процедурой и вызывающей программой Ассемблер.
- •17. Предложение языка ассемблера: директивы.
- •18. Предложения языка ассемблера: команды.
- •19. Предложения языка ассемблера: коментарии.
- •20. Представление данных в ibm pc: алфавитно-цифровые данные
- •21 Представление данных в ibm pc : Вещественные данные
- •22 Представление данных в ibm pc: Двоично-десятичных чисел
- •23 Представление данных в ibm pc: Целые числа
- •24 Программные пакеты masm и tasm общие функции и различие
- •29. Способы адресации в командах мп intel 80 * 86
- •Регистровая адресация
- •Непосредственная адресация
- •30.Способы передачи параметров между процедурой и вызывающейся программой
- •31. Стек . Работа со стеком
- •32. Структуры и форматы команд мп intel 80 * 86. Команды пересылки данных
- •34. Структура мп Intel 80x86: используемые регистры
- •35. Структура мп Intel 80x86: Операционное устройство, Устройство шинного интерфейса
13. Место языков ассемблера среди языков программирования.
Языки программирования – это языки, воспринимаемые и распознаваемые компьютером. Алгоритмические языки позволяют записать алгоритм в виде последовательности операторов, т.е. довольно сложных конструкций, что существенно облегчает и ускоряет процесс программирования и отладки программ. Алгоритмические языки можно считать машинно-независимыми, т.к. основные конструкции таких языков не зависят даже от класса ЦВМ, на которых они устанавливаются. Различия появляются в трансляторах алгоритмических языков, но пользователь-программмист этого не замечает. Универсальные алгоритмические языки позволяют описывать любые алгоритмы и имеют широкие возможности. Проблемно-ориентированные языки имеют специальные библиотеки, облегчающие описание алгоритмов определенного класса. Например, языки для описания баз данных или языки моделирования. Машинно-зависимые языки отличаются тем, что класс ЦВМ, на которых эти языки используются, существенно влияет не только на основные конструкции языков, но и на правила использования этих конструкций. Машинные языки содержат подробные инструкции процессора (команды) в двоично-кодированном виде. Языки символического кодирования (ЯСК) в основном отличаются от машинных языков использованием мнемонических имен для обозначения команд, идентификаторов и дополнительными возможностями, позволяющими упростить процесс программирования. Современные компьютеры содержат специальные программы – ассемблеры, которые предназначены для формирования машинных команд путем перевода со входного языка, называемого языком ассемблера. Каждый класс ЦВМ использует собственный ассемблер (и собственный язык ассемблера). Языки ассемблера несколько различаются между собой, хотя имеют общие черты. Языки ассемблера относятся к классу языков символического кодирования. Языки ассемблера отражают внутреннюю организацию процессора и для их использования необходимо хорошее знание структурных и архитектурных особенностей конкретного компьютера. Рассмотрим язык ассемблера на примере IBM-совместимых персональных ЭВМ (ПЭВМ). К этому классу относятся ПЭВМ, построенные на базе микропроцессоров (МП) фирмы Intel ( 8086, i486, Pentium, Celeron, Atlon и т.п.).
14. Модели памяти и их использования в tasm.
Каждый процессор семейства 80х86 имеет не менее 4 сегментных регистров (CS, DS, ES и SS). Эти регистры содержат значение сегмента, которое описывает физический блок памяти объемом до 64К (или до 4 гигабайт в процессоре 80386 и старше). Все адреса вычисляются с использованием в качестве базового значения одного из сегментных регистров. Смысл значения записанного в сегментном регистре бывает различным и зависит от используемого в процессоре режиме адресации - реального (это единственный режим, который может использоваться в процессорах 8086 и 80186), когда сегментное значение представляет собой фактический номер параграфа, или защищенного режима, когда сегментный регистр содержит селектор (не имеющий числового значения). Операционная система или среда программы определяет, работает программа в реальном или защищенном режиме. Если вы используете защищенный режим процессоров 80386 или 80486, то операционная система определяет также, допустимы ли большие сегменты (до 4 гигабайт). Турбо Ассемблер в одинаковой степени поддерживает все эти операционные среды. В случае общей модели 80х86 программы состоят из одного или более сегментов, где каждый сегмент представляет собой физически различные части кода или данных (или код и данные), к которым можно обращаться через сегментный регистр. На основе этой общей схемы можно построить много производных схем. Чтобы упорядочить их, разработаны стандартные схемы памяти. Так как этих соглашений придерживаются многие языки высокого уровня, в программах на Ассемблере также следует это делать. Один из очевидных способов состоит в разбиении программы на инструкции программы и ее данные. Каждый фрагмент данных программы можно определить как инициализированный (содержащий начальные значения, например, текстовое сообщение) и неинициализированный (не содержащий начального значения). Турбо Ассемблер обычно присваивает неинициализированным данным отдельный сегмент, который можно разместить в конце программы, уменьшив объем выполняемой программы. Обычно достаточно большую часть неинициализированных данных занимает стек. Он также специализирован, так как регистры SS и SP при выполнении программы инициализируются обычно автоматически областью стека. Таким образом, в стандартных моделях памяти стек инициализируется, как отдельный сегмент. Можно также комбинировать сегменты в группы. Преимущество использования групп состоит в том, что вы можете задать сегментное значение для всех сегментов группы. Например, инициализированные данные, неинициализированные данные и сегменты стека часто комбинируются в группы таким образом, что для всех данных программы можно использовать одно и то же значение сегмента. В данной главе описывается, как использовать в вашей программе модели и сегменты, и какие директивы позволяют это делать.
15. Операторы в командах языка ассемблера Операнд – объект, над которым выполняется машинная команда.
Операнды ассемблера описываются выражениями с числовыми и текстовыми константами, метками и идентификаторами переменных с использованием знаков операций и некоторых зарезервированных слов.
Операнды могут комбинироваться с арифметическими, логическими, побитовыми и атрибутивными операторами для расчета некоторого значения или определения ячейки памяти, на которую будет воздействовать данная команда или директива.
Способы адресации операндов
Под способами адресации понимаются существующие способы задания адреса хранения операндов:
операнд задается на микропрограммном уровне (операнд по умолчанию);
операнд задается в самой команде (непосредственный операнд);
операнд находится в одном из регистров (регистровый операнд);
операнд располагается в памяти;
операндом является порт ввода-вывода
операндом является счетчик команд;
операндом является запись;
структурный операнд.
Операнд задается на микропрограммном уровне (операнд по умолчанию): в этом случае команда явно не содержит операнда, алгоритм выполнения команды использует некоторые объекты по умолчанию (регистры, признаки и т.д.).
mul ebx ; eax = eax*ebx, неявно использует регистр eax
Операнд задается в самой команде (непосредственный операнд): операнд является частью кода команды. Для хранения такого операнда в команде выделяется поле длиной до 32 бит. Непосредственный операнд может быть только вторым операндом (источником). Операнд-получатель может находиться либо в памяти, либо в регистре.
mov eax, 5 ; eax = 5; add ebx, 2 ; ebx = ebx + 2; Операнд находится в одном из регистров (регистровый операнд): в коде команды указываются именами регистров. В качестве регистров могут использоваться:
32-разрядные регистры ЕАХ, ЕВХ, ЕСХ, EDX, ESI, EDI, ESP, EBP;
16-разрядные регистры АХ, ВХ, СХ, DX, SI, DI, SP, ВР;
8-разрядные регистры АН, AL, BH, BL, CH, CL, DH, DL;
сегментные регистры CS, DS, ,SS, ES, FS, GS.
add eax, ebx ; eах = eax + ebх dec esi ; esi = esi - 1
Операнд располагается в памяти. Данный способ позволяет реализовать два основных вида адресации:
прямую адресацию;
косвенную адресацию.
Прямая адресация: эффективный адрес определяется непосредственно полем смещения машинной команды, которое может иметь размер 8, 16 или 32 бита.
mov eax, sum ; eax = sum
Ассемблер заменяет sum на соответствующий адрес, хранящийся в сегменте данных (по умолчанию адресуется регистром ds) и значение, хранящееся по адресу sum, помещает в регистр eax.
Косвенная адресация в свою очередь имеет следующие виды:
косвенная базовая (регистровая) адресация;
косвенная базовая (регистровая) адресация со смещением;
косвенная индексная адресация;
косвенная базовая индексная адресация.
