У нас: 141825 рефератів
Щойно додані Реферати Тор 100
Скористайтеся пошуком, наприклад Реферат        Грубий пошук Точний пошук
Вхід в абонемент



Реферат - Assembler
42



примеру, оно может быть определено операторами equ или =.

num    equ     5

imd = num-2       

mov    al,num ;эквивалентно mov al,5 

;5 здесь непосредственный операнд       

add    [si],imd        ; imd=3 - непосредственный операнд       

mov    al,5            ;5 - непосредственный операнд        

В данном фрагменте определяются две константы, которые затем используются в качестве непосредственных операндов в командах пересылки mov и сложения add. Адресные операнды - задают физическое расположение операнда в памяти с помощью указания двух составляющих адреса: сегмента и смещения (рис. 4).

Рис. 4. Синтаксис описания адресных операндов

К примеру:

mov    ax,0000h       

mov    ds,ax       

mov    ax,ds:0000h     ;записать слово в ax из области памяти по                                       

;физическому адресу

0000:0000        

Здесь третья команда mov имеет адресный операнд. 

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

К примеру:

data   segment

mas_w  dw     25 dup (0)

:

code   segment

:       

lea    si,mas_w       ;mas_w - перемещаемый операнд 

В этом фрагменте mas_w - символьное имя, значением которого является начальный адрес области памяти размером 25 слов. Полный физический адрес этой области памяти будет известен только после загрузки программы в память для выполнения. 

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

jmp $+3 ;безусловный переход на команду mov 

cld ;длина команды cld составляет 1 байт 

mov al,1  

При использовании подобного выражения для перехода не забывайте о длине самой команды, в которой это выражение используется, так как значение счетчика адреса соответствует смещению в сегменте команд данной, а не следующей за ней команды. В нашем примере команда jmp занимает 2 байта. Но будьте осторожны, длина команды зависит от того, какие в ней используются операнды. Команда с регистровыми операндами будет короче команды, один из операндов которой расположен в памяти. В большинстве случаев эту информацию можно получить, зная формат машинной команды и анализируя колонку листинга с объектным кодом команды. Регистровый операнд - это просто имя регистра. В программе на ассемблере можно использовать имена всех регистров общего назначения и большинства системных регистров.

mov al,4 ;константу 4 заносим в регистр al 

mov dl,pass+4 ;байт по адресу pass+4 в регистр

dl 

add al,dl ;команда с регистровыми

операндами

Базовый и индексный операнды. Этот тип операндов используется для реализации , или их и . 

Структурные операнды используются для доступа к конкретному элементу сложного типа данных, называемого . 

Записи (аналогично структурному типу) используются для доступа к битовому полю некоторой .

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

Результатом вычисления выражения может быть адрес некоторой ячейки памяти или некоторое константное (абсолютное) значение.

Возможные типы операндов мы уже рассмотрели. Перечислим теперь возможные типы операторов ассемблера и синтаксические правила формирования выражений ассемблера.

 

В приведены поддерживаемые языком ассемблера операторы и перечислены их приоритеты. Дадим краткую характеристику операторов:

Арифметические операторы. К ним относятся:

унарные "+" и "-";

бинарные "+" и "-";

умножения "*";

целочисленного деления "/";

получения остатка от деления "mod".

Эти операторы расположены на уровнях приоритета 6, 7, 8 в . Например,

tab_size equ 50 ;размер массива в байтах

size_el equ 2 ;размер элементов

:

;вычисляется число элементов массива и заносится в

регистр cx 

mov cx,tab_size / size_el ;оператор "/"

Рис. 5. Синтаксис арифметических операций

Операторы сдвига выполняют сдвиг выражения на указанное количество разрядов (рис. 6). Например,

mask_b equ 10111011

:

mov al,mask_b shr 3 ;al=00010111

Рис. 6. Синтаксис операторов сдвига

Операторы сравнения (возвращают значение "истина" или "ложь") предназначены для формирования логических выражений (см. рис. 7 и ). Логическое значение "истина" соответствует цифровой единице, а "ложь" - нулю. Например,      

tab_size equ 30 ;размер таблицы

mov al,tab_size ge 50 ;загрузка размера

таблицы в al 

cmp al,0 ;если tab_size < 50, то 

je m1 ;переход на m1

:

m1: :

В этом примере если значение tab_size больше или равно 50, то результат в al равен 0ffh, а если tab_size меньше 50, то al равно 00h. Команда cmp сравнивает значение al с нулем и устанавливает соответствующие флаги в flags/eflags. Команда je на основе анализа этих флагов передает или не передает управление на метку m1.

Рис. 7. Синтаксис операторов сравнения

Таблица 1. Операторы сравнения

Оператор | Значение

eq | ИСТИНА, если выражение_1 равно выражение_2

ne | ИСТИНА, если выражение_1 не равно выражение_2

lt | ИСТИНА, если выражение_1 меньше


Сторінки: 1 2 3 4 5 6 7 8 9 10 11 12