Главная | Обратная связь | Поможем написать вашу работу!
МегаЛекции

Арифметические операции над целыми двоичными числами

Сложение двоичных чисел без знака

inc операнд - операция инкремента, то есть увеличения значения операнда на 1;

inc ax; ax:=ax+1

inc x1

 

add оп1,оп2 - команда сложения с принципом действия: оп1 = оп1 + оп2 (addition)

add al, bl

add ax, 0fe2h

add ebx, x1+2

add x1, 0fh

add x2, ax

 

adc оп1,оп2 - команда сложения с учетом флага переноса cf. оп1 = оп1 + оп2 + знач_cf

 

Вычитание двоичных чисел без знака

dec операнд — операция декремента, то есть уменьшения значения операнда на 1;

dec cx;cx:=cx-1

dec x

sub операнд_1,операнд_2 — команда вычитания; ее принцип действия:

операнд_1 = операнд_1 – операнд_2

sub al, bl; al:=al-bl

sub ax, x1

sub x2, dx

sub eax, 0f35h

sub x2, 22h

 

sbb операнд_1,операнд_2 — команда вычитания с учетом заема (флага cf):

операнд_1 = операнд_1 – операнд_2 – значение_cf

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

model small.stack 100h.data x1      db   0c2hx2      db   022hy db  ? .code start: mov ax,@data mov ds,ax mov al, x1 add al, x2 mov y, al mov ax,4c00h int    21 h

End start

Умножение двоичных чисел

mul множитель_1 - операция умножения двух целых чисел без учета знака

Алгоритм работы:

Команда выполняет умножение двух операндов без учета знаков. Алгоритм зависит от формата операнда команды и требует явного указания местоположения только одного сомножителя, который может быть расположен в памяти или в регистре. Местоположение второго сомножителя фиксировано и зависит от размера первого сомножителя

 

mul dl; ax:=al*dl, dl- множитель_1, al- множитель_2

mul x1; dx:ax=ax*0ad91h, x1 word- множитель_1, ax- множитель_2

mul ecx; edx:eax=eax*ecx, ecx- множитель_1, eax- множитель_2

 

imul множитель_1 - операция умножения двух целочисленных двоичных значений со знаком

 

Деление двоичных чисел

div делитель - выполнение операции деления двух двоичных беззнаковых значений

Алгоритм работы:

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

 

div dl;ah:al=ax/dl, ax –делимое, dl- делитель, ah-частное, al -остаток

div x1;ax:dx=dx:ax/0ad91h, dx:ax –делимое, x1 word- делитель, ax-частное,

;dx -остаток

div ecx;eax:edx=edx:eax/ecx, edx:eax –делимое, ecx- делитель, eax-частное,

;edx -остаток

idiv делитель - операция деления двух двоичных значений со знаком

 

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

model small.stack 100h.data x1      db   78yl       db  ?yh      db  ? .code start: mov ax,@data mov ds,ax xor  ax, ax mov al, 25 mul x1 jnc   m1 ;если нет переполнения mov yh,ahm1:    mov yl, al mov ax,4c00h int   21h

end start


Пример. Вычислите следующее выражение у=(х2-х3)/х1, х1,х2,х3 - однобайтные числа

Model    small

Stack    100h

Data

s1 db 'Введите х1',10,13,'$'

s2 db 'Введите х2',10,13,'$'

s3 db 'Введите х3',10,13,'$'

x1 db?

x2 db?

yc db?;частное

yo db?;остаток

Code

start:

mov ax,@data

Mov ds,ax

 


mov ah,09h

mov dx, offset s1

int 21h;вывод строки

mov ah,01h                               вводим х1

int 21h;вводим число

sub al,30h            ;al:=x1

mov x1,al


mov ah,09h

mov dx, offset s2

int 21h

mov ah,01h                               вводим х2

int 21h

sub al,30h            ;al:=x2

mov x2,al

 

mov ah,09h

mov dx, offset s3

int 21h

mov ah,01h                               вводим х3

int 21h

sub al,30h            ;al:=x3

 


mov bl,x2     ;bl:=x2

sub bl,al      ;bl:=x2-x3

xchg al,bl      ;al:=bl, al:=x2-x3

xor ah,ah    ;ax:=x2-x3               вычисляем у

mov dl,x1     ;dl:=x1

div dl          ;ax/dl,    ax/x1

 

mov yc,ah

mov yo,al

 

; можно вывести результат на экран

 

Mov ax,4 c 00 h

Int 21h

End start

Команды сдвига

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

Все команды сдвига устанавливают флаг переноса cf.

shl операнд,счетчик_сдвигов (Shift Logical Left) - логический сдвиг влево. Содержимое операнда сдвигается влево на количество битов, определяемое значением счетчик_сдвигов. Справа (в позицию младшего бита) вписываются нули;

shr операнд,счетчик_сдвигов — логический сдвиг вправо.

 

shl al, 2 Было al=00001101 Стало al=00110100   shr ax, 8 Было ax=4faf, стало ax=004f   mov cl,05h shl bh, cl bh=00010110 bh=11000000   shr  x1,3

Алгоритм работы команд:

· очередной “выдвигаемый” бит устанавливает флаг cf;

· бит, вводимый в операнд с другого конца, имеет значение 0;

· при сдвиге очередного бита он переходит во флаг cf, при этом значение предыдущего сдвинутого бита теряется!

sal операнд,счетчик_сдвигов (Shift Arithmetic Left)

Поделиться:





Воспользуйтесь поиском по сайту:



©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...