Инструкции пересылки данных и двоичной арифметики 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Инструкции пересылки данных и двоичной арифметики



Команды данной группы приведены в таблице 5.4. Код определяет выполняемое командой действие, операнды показывают адреса ячеек, хранящих исходные данные, необходимые для выполнения команды и адрес ячейки результата.

Таблица 5.4 Инструкции пересылки данных и двоичной арифметики

 

Мнемокод

Действие

Код Операнды
mov dst, src. пересылка
add dst, src сложение
inc dst увеличить на единицу
sub dst, src вычитание
dec dst уменьшение на единицу
neg dst изменение знака
sal dst,счетчик арифметический сдвиг влево
sar dst, счетчик арифметический сдвиг вправо (по мере сдвига вправо освобождающиеся места заполняются значением знакового разряда)
shl dst, счетчи к логический сдвиг влево
shr dst, счетчик логический сдвиг вправо
xlat таблица трансляция байтов из таблицы
lea dst, src загрузка исполнительного адреса
mod dst, src получения остатка от деления

 

Процессор i 8086 и более поздние версии относятся к двухадресным машинам. Это значит, что его команда может содержать не более двух операндов. Если для выполнения команды необходимо иметь два источника данных, например, сложение, то сохранение результата выполнения команды производиться по адресу одного из источников данных. Чтобы показать, какой из операндов будет хранить результат, его обозначают при описании команды как dst (destination – назначение), операнд, который используется только как адрес исходных данных, обозначается как src (source – источник). В двухоперандных командах операнд dst указывает, перед выполнением команды, адрес исходного данного, а после выполнения – адрес результата.

Запись программ на языке Ассемблер

Ниже приведена типичная структура простой программы на ассемблере.

. model small

. data;директива начала сегмента данных

d1 dw 34h

d2 db 10100110b

d3 dd 3 dup (?)

.code

start: mov ax,data; Загрузить адрес

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

                     .

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

quit: mov ax,4c00h; Код завершения 0

int 21 h       ; Выход в DOS

end start

Загрузка адреса сегмента данных состоит из двух команд, так как непосредственные данные нельзя заносить прямо в сегментный регистр.

Для завершения программы и выхода в DOS имеется несколько возможностей, рекомендуется использовать две команды, начинающиеся с метки quit.

Пример вычисления арифметического выражения

Вычислить     Х = 3А + (В + 5) / 2 – С – 1,

где A, В, С, Х - целые знаковые числа, занимающие слово, написать программу, реализующую данную формулу.

Распишем формулу по отдельным операциям:

АХ ← А                  ; значение A в регистре АХ

АХ ← 2 *(АХ)      ; 2А в АХ

АХ ← (АХ) + А             ; 3А в АХ

ВХ ← В                  ; В в ВХ

ВХ ← 5 + (ВХ)              ; В+5 в ВХ

ВХ ← (ВХ) / 2       ; (В+5) / 2 в ВХ

АХ ← (BX) + (AX); 3А+(В+5) / 2 в АХ

АХ ← (АХ) – С              ; 3А+(В+5) / 2 – С в АХ

АХ ← (АХ) -1       ; 3А+(В+5)/2 – С – 1 в АХ

 Х ← (АХ)            ; 3А+(В+5)/2 – С – 1 в Х

Ниже приведена типичная структура простой программы на Ассемблере. Текст программы:

. model small

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

a dw 10

b dw 20

c dw 5

x dw?       ;неинициализированное данное

. stack       100 h    ;сегмент стека

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

start: mov ax, @ data; загрузка адреса сегмента данных

  mov ds, ax    ;регистр сегмента данных можно загружать только

                                ;из регистра

  mov ax, a     

  sal  ax, 1     ;A * 2

add ax, a     ;3 * A

mov bx, b     

add bx, 5     ;B+5

shr  bx, 1     ;(B+5)/2

add ax, bx             ;3*A+(B+5)/2

sub ax, c      ;3*A+(B+5)/2-C

dec ax          ;3А+(В+5)/2 – С – 1

mov x, ax      ; запись результата в память

quit: mov ax, 4 c 00 h; код завершения 0, 4 c – имя программы

int   21         ; выход в dos

end start

5.7   Циклические и разветвляющиеся программы

Команда передачи, управления служит для передачи управления инструкции, не следующей непосредственно за данной. Управление может передаваться как внутри текущего сегмента кода (внутрисегментная передача управления), так и за его пределы (межсегментная передача управления). Тип передачи управления может быть задан Ассемблеру предшествующим адресу перехода ключевым словом NEAR (внутрисегментная) или FAR (межсегментная).

Безусловный переход

Инструкция безусловного перехода передаёт управление команде, адрес которой указан в инструкции.

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

Типы переходов:

- переход типа short (короткий ) – если адрес перехода находится в пределах от –127 до +128 байт от команды, вызвавшей переход;

- переход типа near (ближний) – если адрес перехода находится в том же сегменте, что и команда, вызвавшей переход;

- переход типа far (дальний) – если адрес перехода находится в другом сегменте.

Формат команды безусловного перехода:

jmp [< тип > ptr ] операнд

<тип> - тип перехода short (короткий) – смещение 127 байтов вперёд или 128 байтов назад, near (близкий) – смещение в пределах сегмента (64 Кбайта), far (дальний) – в любой сегмент с любым смещением.

ptr – приставка, которую можно перевести как указанный в.

Если тип не задан, по умолчанию принимается near. В таблице 5.5 приведены типы безусловных переходов.

Таблица 5.5

Типы команд безусловного перехода

Название Мнемоника Описание
внутрисегментный прямой короткий переход jmp short <операнд> IP ← (IP) + 8-битное сме­ще­ние, определяемое операндом
внутрисегментный прямой близкий переход jmp near ptr <операнд> IP ← (IP)+16-битное сме­щение, определяемое операндом
внутрисегментный косвенный переход jmp <адрес операнда>   IP ← 16-битный адрес перехода
Межсегментный прямой далекий переход jmp far ptr <операнд> IP ← смещение операнда в сегменте CS ← адрес сег­мен­та, содержа­ще­го опе­ранд
Межсегментный косвенный далёкий переход jmp far ptr <адрес опе­ран­да> IP ← операнд CS ← адрес операн­да +2

 

Условный переход

Команда условного перехода организует передачу управления при выполнении определённого в команде условия, в противном случае переход осуществляется на команду, следующую за инструкцией условного перехода. Условия определяются текущим состоянием флагов процес­сора. Каждая из 30 команд условных переходов проверяет определенную ком­би­нацию флагов.

Все условные переходы являются короткими, т.е. адрес перехода должен отстоять не далее, чем на - 128 или +127 байтов от первого байта следующей команды. Формат команды:

J < условия перехода > < операнд>

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

Таблица 5.6 Значение аббревиатур в названии команды jcc

 

Обозначение Англ. Русский Тип операндов
e e qual Равно любые
n n ot Не любые
g greater Больше числа со знаком
l l ow Меньше числа со знаком
a a bove Выше (больше) числа без знака
b b ellow Ниже (меньше) числа без знака

Эти команды осуществляют переходы типа short и near

 

Таблица 5.7 Перечень команд условного перехода для команды cmp

Условие

Мнемокод

со знаком без знака
ОП-1 = ОП_2

je e qual

ОП-1 < >ОП_2

jne n ot e qual

ОП-1 < ОП_2 j l     l ow j ngen ot g reater or e qual j b b elow j naen ot a bove or e qual
ОП-1 <= ОП_2 j le   l ow or  e qual j ngn ot g reater j beb elow or e qual j nan ot a bove
ОП-1 > ОП_2 j g   greater j nlen ot l ow or e qual j a a bove j nben ot b elow or e qual 
ОП-1 => ОП_2 j geg reater or e qual j nln ot l ower j aea bove or e qual j nbn ot b elow

Циклы

Инструкция, организующая программный цикл имеет вид: 

loop [<условие повторения цикла>] <метка короткого перехода>

Инструкция loop использует содержимое регистра СХ как счетчик повторений цикла. Команда loop уменьшает содержимое регистра СХ на 1 и передает управление по адресу, определяемому меткой перехода, если содержимое СХ ≠ 0, в противном случае выполняется следующая за LOOP инструкция. Подобно условным переходам инструкции этой группы могут осуществлять только короткие передачи управления, т.е. в пределах от -128 до +127.

Добавление к инструкции loop <условие повторения цикла> позволяет ввести дополнительные логические условия на повторение цикла:

loop e / loopz – повторять, пока ноль;

loopne / loopnz – повторять, пока не ноль.

Проверка флага ZF осуществляется командой loop. Цикл повторяется, если содержимое СХ ≠ 0 и выполняется соответствующее условие, в противном случае выполняется следующая за loop инструкция.

Примеры использования операторов переходов и цикла при работе с массивами чисел

1. Дан массив из десяти слов, содержащих целые числа. Требуется найти максимальное значение в массиве. Одно слово занимает 2 байта.

Текст программы:

. model small

.data

max dw?

mass dw 10,24,76,479,-347,281,-24,70,124,97

.stack 100h

.code

start: mov ax, @data

mov ds, ax    ; Загрузить сегментный адрес данных

lea bx, mass; Загрузить адрес смещения массива

mov cx, 10    ; Установить счетчик повторений цикла,

;счетчик равен количеству элементов массива

mov ax, [ bx ]; Первый элемент массива в Аккумулятор

beg: cmp [bx], ax; Сравнить текущий элемент массива с

;максимальным

    jl no          ; он меньше

mov ax, [bx]  ; он больше или равен

no: inc bx         ; Следующий элемент массива находится

    inc bx          ; со смещением в два байта, bx увеличивается на 2

    loop beg       

    mov max, ax

quit: mov ax,4C00h; Код завершения 0

int 21 h       ; Выход в DOS

end start

2. Заменить все отрицательные числа нулями. Массив байт.

. model small

.data

mass db 1,2,7,-4,-34,28,-24,7,12,9

.stack 100h

.code

start: mov ax, @data

mov ds, ax    ; Загрузить сегментный адрес данных

    lea bx, mass; Загрузить адрес смещения массива

    mov cx, 10    ; Установить счетчик повторений цикла

    mov al, 0    

 beg: cmp [bx], a l; Сравнить текущий элемент массива с нулём

    j g no          ; он больше

mov [bx], a l  ; обнуление элемента массива

no: inc bx         ; Следующий элемент массива

    loop beg       

quit: mov ax,4 C 00 h; Код завершения 0

int 21 h       ; Выход в DOS

end start

3. Найти сумму абсолютных величин. Массив байт.

.model small

.data

sum db?

mass db 1,2,7,-4,-3, 8,-2,7,12,9

.stack 100h

.code

start: mov ax, @data

mov ds, ax    ; Загрузить сегментный адрес данных

lea bx, mass; Загрузить адрес смещения массива

mov cx, 10    ; Установить счетчик повторений цикла

beg: mov dl, [bx]

cmp dl, 0    ; Сравнить текущий элемент массива с нулём

j g no          ; он больше

neg dl           ; изменение знака элемента массива

no: add sum,dl

inc bx         ; Следующий элемент массива

loop beg       

quit: mov ax,4 C 00 h; Код завершения 0

int 21 h    ; Выход в DOS

end start

 

В программах достаточно часто используются таблицы для перевода информации из одной системы кодировки в другую, с этой целью используется   команда xlat -трансляция байтов из таблицы. Эта команда предполагает загрузку на bx -адрес таблицы пересчёта, на al возвращается код числа.

; таблица пересчёта символьного кода числа в 16-ный,

tab1 db 48 dup(0),0,1,2,3,4,5,6,7,8,9, 7 dup(0),0ah

    db 0bh,0ch,0dh,0eh,0fh, 26 dup(0)

    db 0ah,0bh,0ch,0dh,0eh,0fh, 153 dup(0)

;таблица пересчёта из 16-ой цифры в ASCII код

tab2 db “0123456789ABCDEF”

Пример перевода введённого символа в 16-ый код:

    mov ah,01 h   ; ввод с клавиатуры новой цифры

    int 21h

    mov a,al

    lea bx, tab 1 ; адрес таблицы пересчётов

    xlat

    mov b, al    ;на al 16-ая цифра

Пример вывода на экран монитора двухзначного числа, записанного на al:

    lea bx, tab 2  ; адрес таблицы пересчётов

    mov b, al        ;на al две цифры

    shr al,4    ; на al старшая цифра

    xlat

    mov dl,al

mov ah,02 h            ; вывод на монитор старшей цифры

    int 21h

    mov al,b

    and al,00001111b;

xlat

    mov dl,al

mov ah,02 h       ; вывод на монитор младшей цифры

    int 21 h



Поделиться:


Читайте также:




Последнее изменение этой страницы: 2021-12-15; просмотров: 54; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.144.86.134 (0.092 с.)