Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Основной текст лекций.doc
Скачиваний:
4
Добавлен:
01.05.2025
Размер:
1 Мб
Скачать
☆
    1. Основные типы операндов

  • Постоянные или непосредственные операнды — число, строка, имя или выражение, имеющие некоторое фиксированное значение. Имя не должно быть перемещаемым, то есть зависеть от адреса загрузки программы в память. К примеру, оно может быть определено операторами equ или =.

num equ 5

imd = num-2

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

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

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

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

  • Адресные операнды — задают физическое расположение операнда в памяти с помощью указания двух составляющих адреса: сегмента и смещения

mov ax,0000h

mov ds,ax ; ds – регистр сегмента данных

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

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

Счетчик адреса — специфический вид операнда. Он обозначается знаком $. Транслятор подставляет вместо него текущее значение счетчика адреса.

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

; команда jmp занимает 2 байта.

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

  mov al,1  

  • Регистровый операнд — это просто имя регистра. В программе на ассемблере можно использовать имена всех регистров общего назначения и большинства системных регистров.

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

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

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

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

    1. Типы операторов

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

  • арифметические операторы;

  • операторы сдвига;

  • операторы сравнения;

  • логические операторы;

  • индексный оператор;

  • оператор переопределения типа;

  • оператор переопределения сегмента;

  • оператор именования типа структуры;

  • оператор получения сегментной составляющей адреса выражения;

  • оператор получения смещения выражения.  

Краткая характеристика операторов:

  • Арифметические операторы. К ним относятся: унарные «+» и «–», бинарные «+» и «–», умножения «*», целочисленного деления «/», получения остатка от деления «mod».

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

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

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

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

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

  • Операторы сдвига выполняют сдвиг выражения на указанное количество разрядов

mask_b equ 10111011 ;исходное состояние маски

mov al,mask_b shr 3 ;al=00010111

  • Логические операторы выполняют над выражениями побитовые операции. Выражения должны быть абсолютными, то есть такими, численное значение которых может быть вычислено транслятором.

flags equ 10010011

  mov al,flags xor 01h  ;al=10010010

;пересылка в al поля flags с инвертированным правым битом

  • Индексный оператор [ ] - транслятор их наличие воспринимает как указание сложить значение выражение_1 за этими скобками с выражение_2, заключенным в скобки (<выражение_1 >[<выражение_2>]).

mov ax, mas[si] ;пересылка слова по адресу mas+(si) в регистр ax

  • Оператор получения смещения выражения offset позволяет получить значение смещения выражения в байтах относительно начала того сегмента, в котором выражение определено

.data ;сегмент данных

pole dw 5

...

.code ;сегмент программы

...

mov  ax, seg  pole

mov  es, ax

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

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.

CMP – сравнивает два операнда путем вычитания второго операнда из первого. Значения операндов при этом не меняются. Используется для дальнейшего анализа командой условного перехода.

1-ый операнд = Рг или переменная, 2-ой операнд = число, Рг или переменная (cmp ax,bx; cmp ax,3; cmp d,ax).

  • Оператор переопределения типа ptr применяется для переопределения или уточнения типа метки или переменной, определяемых выражением. Тип может принимать одно из следующих значений: byte, word, dword, qword, tbyte, near, far.

d_wrd   dd      0

...

        mov     al, byte ptr d_wrd+1 ;пересылка второго байта из двойного слова

Переменная d_wrd имеет тип двойного слова. Если возникнет необходимость обращения не ко всей переменной, а только к одному из входящих в нее байтов (например, ко второму), то при использовании команды mov al,d_wrd+1 транслятор выдаст сообщение о несовпадении типов операндов. Оператор ptr позволяет непосредственно в команде переопределить тип и выполнить команду.

  • Оператор переопределения сегмента : (двоеточие) заставляет вычислять физический адрес относительно конкретно задаваемой сегментной составляющей: «имя сегментного регистра», «имя сегмента» из соответствующей директивы SEGMENT или «имя группы». Микропроцессор на аппаратном уровне поддерживает три типа сегментов — кода, стека и данных. Для выборки на выполнение очередной команды микропроцессор должен обязательно посмотреть содержимое сегментного регистра cs и только его. В этом регистре содержится (пока еще не сдвинутый) физический адрес начала сегмента команд. Для получения адреса конкретной команды микропроцессору остается умножить содержимое cs на 16 (что означает сдвиг на четыре разряда) и сложить полученное 20-разрядное число с относительным (математическим) адресом.