Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
КОНСПЕКТ ЛЕКЦИЙ ПО АССЕМБЛЕРУ.doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
471.55 Кб
Скачать

Команда сложения с переносом adc

ADC ОР1,ОР2

OP1 OP2 OP1 := OP1 + OP2 + CF

| |

v v

┌──┐ ┌───┴──┐ ┌─┴────┐

│СF│<- └┐ └─┘ ┌┘

└──┘ └┐ СУММАТОР ┌┘<────┐

│ └─────┬─────┘ │

│ │ │

└─────────────┼────────────┘

V

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

┌─────┬─────┐

+ └──┴──┴──┴──┘

┌─────┬─────┐

└──┴──┴──┴──┘

-----------------------------

┌─────┬─────┐ ┌─────┬─────┐

└──┴──┴──┴──┘ └──┴──┴──┴──┘

│ ┌──┐ │

└─┤СF├─┘

└──┘

A DD ?

B DD ?

C DD ?

MOV AX,word ptr A ; младшее слово

ADD AX,word ptr B ; 1-е сложение

MOV word ptr C,AX ; выполнено сложение младших слов

; полей

MOV AX,word ptr A+2; старшее слово

ADC AX,word ptr B+2; 2-е сложение

MOV word ptr C+2,AX; результат сложения в С

Этот пример показывает, как в 16-разрядной машине производится сложение операндов LONGINT.

Команда вычитания sub

SUB OP1,OP2

OP1:=OP1-OP2

В обычном процессоре отсутствует вычитатель, и поэтому к первому операнду прибавляется второй с противоположным знаком ==>

OP1:=OP1+(-OP2)

SUB AL,BL

AL=5=05h= 0.0000101b

BL=18=12h=0.0010010b

| изменение знака

V

OF SF ZF AF PF CF 1.1101110b

┌──┬──┬──┬──┬──┬──┐ 0.0000101b

│ 0│ 1│ 0│ *│ 1│ 0│ ----------

└──┴──┴──┴──┴──┴──┘ 1.1110011b дк

----------

1.0001101b пк = -13

Все флаги формируются по правилу сложения чисел со знаком.

КОМАНДА ВЫЧИТАНИЯ С ЗАЁМОМ SBB

SBB OP1,OP2

OP1:=OP1-OP2-CF

Используется для вычитания чисел, длина которых превышает слово.

КОМАНДА ВЫЧИТАНИЯ DEC

DEC OP ; однооперандная

OP := OP – 1; алгоритм

Команда формирует все флаги, кроме флага переноса CF (не определен).

КОМАНДА NEG

NEG OP

OP := –OP – инвертирует операнд

КОМАНДА СЛОЖЕНИЯ INC

INC OP

OP := OP + 1

Команда формирует все флаги, кроме флага переноса CF (который не определён).

MUL – беззнаковое умножение

mul OP───┬──>регистр

└──>ячейка памяти

mul 5 – недопустимая команда

В команде явно присутствует второй операнд, по умолчанию первый операнд – регистр AL или AX.

Использование непосредственного операнда запрещено, т. к. неизвестно, какая должна быть у него длина (8 или 16 бит).

mul BH ┌───┐

------ └───┘AL

;AX := AL * BH * ┌───┐

└───┘BH

─────────

┌───┬───┐

└───┴───┘AX

mul BX ┌───┬───┐

------ └───┴───┘AX

* ┌───┬───┐

;(DX:AX) := AX * BX └───┴───┘BX

──────────────────

┌───┬───┐┌───┬───┐

└───┴───┘└───┴───┘

DX AX

Пусть мы имеем два максимальных двузначных десятичных числа

99 * 99 = 9801

Перемножение двузначного на двузначное дает число не более четырёх цифр.

Диапазон байта 0..255

0..(28 - 1)

(28 - 1) * (28 - 1) = 65025 < (216 - 1),

а диапазон слова: 0..65535, 0..(216 - 1)

(216 - 1)* (216 - 1) = 4294836225<(2^32 - 1).

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

Однако именно в команде умножения формируются синхронно два флага CF и OF. Значение '1' определяет ситуацию переполнения, которая сигнализирует о том, что значение произведения превышает длину исходных операндов.

Пример: ┐

AL=25│

* ├─0..255

BH=25│

───────

AX=625

┌───┬───┐

│ 02│ 71│-> CF=1, OF=1

└───┴───┘

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

15 * 15 = 225 = E1h

┌───┐

│ 0F│AL

└───┘

* ┌───┐

│ 0F│BH

└───┘

─────────

┌───┬───┐

┌──│ 00│ E1│AX

│ └───┴───┘

V └─┬─┘

OF=0 └──────>результат в AL

CF=0

Все остальные флаги в команде формируются хаотично.