Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
сп экзамен (Автосохраненный).docx
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
427.44 Кб
Скачать

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.

Косвенная адресация в свою очередь имеет следующие виды:

  • косвенная базовая (регистровая) адресация;

  • косвенная базовая (регистровая) адресация со смещением;

  • косвенная индексная адресация;

  • косвенная базовая индексная адресация.