Арифметические операции над целыми двоичными числами
Сложение двоичных чисел без знака 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 hEnd 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 21hend 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 операнд,счетчик_сдвигов — логический сдвиг вправо.
Алгоритм работы команд: · очередной “выдвигаемый” бит устанавливает флаг cf; · бит, вводимый в операнд с другого конца, имеет значение 0; · при сдвиге очередного бита он переходит во флаг cf, при этом значение предыдущего сдвинутого бита теряется! sal операнд,счетчик_сдвигов (Shift Arithmetic Left)
Воспользуйтесь поиском по сайту: ©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...
|