Мегаобучалка Главная | О нас | Обратная связь


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



2019-12-29 175 Обсуждений (0)
Арифметические операции над целыми двоичными числами 0.00 из 5.00 0 оценок




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

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

inc     ax;  ax:=ax+1

inc     x1;  х1:=х1+1

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

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

model small . stack 100 h . data x1      db   0c2h ;первое слагаемоеx2      db   022h ;второе слагаемоеy db   ?     ;результат . code start : mov    ax ,@ data mov    ds , ax mov   al, x1 ;помещаем в al первое слагаемоеadd    al, x2 ;складываем х1 и х2mov   y, al ;помещаем результат на местоmov   ax,4c00h int      21h

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

 

в результате умножения может возникнуть ситуация когда результат по размеру превысит 16 или 32 бита, тогда старшая часть результата умножения заноситься в dx или edx соответственно.

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делитель - операция деления двух двоичных значений со знаком

 

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

model small .stack 100h .datax1      db   78   ;первый множительyl       db   ?     ;первый байт результатаyh      db   ?     ;второй байт результата . code start : mov    ax ,@ data mov    ds , ax xor     ax, ax ;очищаем регистр axmov   al, 25 ;помещаем в al второй сомножительmul    x1jnc     m1  ;если нет переполнения, переходим на метку m1mov   yh,ah ;иначе старший байт результата помещаем в yhm1:mov   yl, al ;результат помещаем на местоmov   ax,4c00h int      21h

End    start

 

Пример 8. Деление двух однобайтных чисел.

model small .stack 100h .datax1      db   6     ;делительyl       db   ?     ;остатокyh      db   ?     ;частное . code start : mov    ax ,@ data mov    ds , ax xor     ax, ax ;очищаем регистр axmov   ax, 25 ;помещаем в al делимоеdiv     x1mov   yh,ah ;помещаем частное на местоmov   yl, al ;помещаем остаток на местоmov   ax,4c00h int      21h

End    start

ASCII коды и их интепритация

Ввод информации с клавиатуры и вывод ее на экран осуществляется в символьном виде, т.е. любой символ предоставляется в ASCII кодах. Причем на один символ идет один ASCII код. На два символа – два ASCII кода, и т.д. Любое число, вводимое с клавиатуры и выводимое на экран, представляется последовательностью ASCII кодов.

Табл.1. ASCII коды цифр

Символ шестнадцатеричной цифры Двоичная тетрада ASCII код (двоичное представление) Разница
0 0000 30h (0011 0000) 30h
1 0001 31h (0011 0001) 30h
2 0010 32h (0011 0010) 30h
3 0011 33h (0011 0011) 30h
4 0100 34h (0011 0100) 30h
5 0101 35h (0011 0101) 30h
6 0110 36h (0011 0110) 30h
7 0111 37h (0011 0111) 30h
8 1000 38h (0011 1000) 30h
9 1001 39h (0011 1001) 30h
A a 1010 41h (0100 0001) 61h (0110 0001) 37h 57h
B b 1011 42h (0100 0010) 62h (0110 0010) 37h 57h
C c 1100 43h (0100 0011) 63h (0110 0011) 37h 57h
D d 1101 44h (0100 0100) 64h (0110 0100) 37h 57h
E e 1110 45h (0100 0101) 65h (0110 0101) 37h 57h
F f 1111 46h (0100 0110) 66h (0110 0110) 37h 57h

Рассмотрим последовательность действий для преобразования чисел в их ASCII код и наоборот.

Ввод информации с клавиатуры:

1. Ввод символа с клавиатуры, один ASCII код находится в dl. Заранее не известно, что это за число от 0 до 9 или от а до f.

Cmp dl, 040h

Jb m1 ; если ASCII код меньше 40h значит ввели цифру от 0 до 9,

;переходим на метку m1

Cmp dl, 047h ; иначе ввели букву, заглавную или маленькую?

Jb m2 ;если ввели заглавную, переходим на m2, иначе выполняем

;дальше по программе

sub dl, 057hdl получаем из символов число a..f h

jmp m3 ;переходим на m3 чтобы не выполнять лишних вычислений

m2: sub dl, 037hdl получаем из символов число a..f h

jmp m3

m1: sub dl, 030hdl получаем из символов число 0..9 h

m3:

Далее приведен оптимизированный код преобразования числа из ASCII кодов. Подумайте в чем разница.

Cmp dl,040h

Jb m1

Cmp dl,047h

Jb m2

Sub dl, 020h

m2: sub dl, 07h

m1: sub dl, 030h

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

Вывод информации на экран

0
1. Предположим что, число, которое мы хотим вывести, находится в регистре bl. Вывод символа осуществляется из регистра dl, 02 функция INT 21H. Число может быть одно или двузначное, например 7h или 5Fh. Для универсальности программы будем считать, что надо вывести двузначное число. А для этого надо получить отдельно десятки и единицы, и получить для них два ASCII кода.

;двузначное число которое хотим вывести находится в bl

mov dl, bl ; помещаем число в регистр dl

;сдвигаем содержимое dl на 4 бита вправо, чтобы получить отдельно десятки

shr dl, 4

and bl, 0fh    ;получаем отдельно единицы

cmp dl, 0ah   ;сравниваем dl с ah

jb m1 ;если меньше переходим на m1

add dl, 07h

m1: add dl, 30h

mov ah, 02h

int 21h

mov dl, bl

cmp dl, 0ah   ;сравниваем dl с ah

jb m2

add dl, 07h

m2: add dl, 30h

int 21h

Попробуйте сами разобраться в приведенном кусочке кода.




2019-12-29 175 Обсуждений (0)
Арифметические операции над целыми двоичными числами 0.00 из 5.00 0 оценок









Обсуждение в статье: Арифметические операции над целыми двоичными числами

Обсуждений еще не было, будьте первым... ↓↓↓

Отправить сообщение

Популярное:
Генезис конфликтологии как науки в древней Греции: Для уяснения предыстории конфликтологии существенное значение имеет обращение к античной...
Почему двоичная система счисления так распространена?: Каждая цифра должна быть как-то представлена на физическом носителе...
Модели организации как закрытой, открытой, частично открытой системы: Закрытая система имеет жесткие фиксированные границы, ее действия относительно независимы...



©2015-2024 megaobuchalka.ru Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. (175)

Почему 1285321 студент выбрали МегаОбучалку...

Система поиска информации

Мобильная версия сайта

Удобная навигация

Нет шокирующей рекламы



(0.008 сек.)