Читайте также:
|
|
Команда NEG змінює війкове значення з додатного на від’ємне і з від’ємного на додатне. Фактично, вона віднімає операнд від нуля і додає одиницю.
Додавання багатобайтних чисел
Наведемо універсальну процедуру додавання двох чисел довільної розмірності, використовуючи додавання окремих слів.
При цьому слід: 1) забезпечити сусідство слів; 2) виконувати обробку від молодшого до старшого слова; 3) завантажити в регістр CX кількість слів, що будуть додаватися
Дія починається з додавання наймолодших полів, тобто тих слів, що розташовані в пам’яті за молодшими адресами. У першому циклі додаються ліві слова, а у другому - слова, розташовані правіше. При цьому адреси в регістрах SI, DI і BX збільшуються на 2. Цю операцію виконують по дві команди INC для кожного регістра. Застосовувати команду ADD reg,02 у цьому випадку не можна, тому що при цьому буде очищений прапорець переносу, що приведе до спотворення результату додавання. Оскільки використовується цикл, виконується лише команда додавання ADC. Перед циклом команда CLC (CLear Carry - очистити прапор переносу) установлює нульове значення прапорця переносу.
DOSSEG
.MODEL SMALL
.STACK 100h
.DATA
X DW 1111h, 2222h
Y DW 3333h,4444h
Z DW 3 dup(0)
.CODE
mov ax,@data
mov ds,ax
clc
mov cx,2
lea si,X
lea di,y
lea bx,z
l1:
mov ax,[si]
adc ax,[di]
mov [bx],ax
inc si
inc si
inc di
inc di
inc bx
inc bx
loop l1
adc [bx],0
mov ah,4Ch
int 21h
Для віднімання багатобайтних чисел слід використовувати команду SBB (віднімання з запозиченням), яка є еквівалентом ADD.
Множення
Операція множення для беззнакових даних виконується командою MUL, а для знакових - IMUL (Integer MULtiplication - множення цілих чисел). У єдиному операнді команд MUL і IMUL вказується множник. Відповідальність за контроль над форматом чисел, що обробляються і за вибір відповідної команди множення лежить на самому програмісті. Існують дві основні операції множення:
"Байт на байт". Множене перебуває в регістрі AL, а множник у байті пам'яті або в однобайтовом регістрі. Після множення добуток перебуває в регістрі AX. Операція ігнорує і витирає будь-які дані, які були в регістрі AH.
AX=AL*регістр8/пам’ять8
"Слово на слово". Множене перебуває в регістрі AX, а множник - у слові пам'яті або у двобайтному регістрі. Після множення добуток знаходиться в подвійному слові, для якого потрібно два регістри: старша (ліва) частина добутку - в регістрі DX, а молодша (права) частина - в регістрі AX. Операція ігнорує й стирає будь-які дані, які перебували в регістрі DX.
DX:AX=AX* регістр16/пам’ять16
Розглянемо наступну команду:
MUL MULTR
Якщо поле MULTR визначене як байт (DB), то операція припускає множення вмісту AL на значення байта з поля MULTR. Якщо поле MULTR визначене як слово (DW), то операція припускає множення вмісту AX на значення слова з поля MULTR. Якщо множник перебуває в регістрі, то довжина регістра визначає тип операції, як це показано нижче:
MUL CL; Байт-множник: множене в AL, добуток в AX.
MUL BX; Слово-множник: множене в AX, добуток DX:AX.
Команда IMUL призначена для множення чисел зі знаком. Формат її використання аналогічний MUL.
Якщо множник і множене мають однаковий знак, то IMUL та MUL генерують однаковий результат, а якщо множники мають різні знаки, то команда MUL виробляє доданій результат, а команда IMUL – від’ємний.
Для підвищення ефективності операції множення, при множенні на степінь числа 2 більш доцільним є зсув вліво на необхідну кількість бітів. Зсув більше ніж на один розряд потребує параметру у регістрі CL. Наприклад:
Множення на 2 SHL al,1
Множення на 8: MOV CL,3
SHL AX,CL
Дата добавления: 2014-12-19; просмотров: 124 | Поможем написать вашу работу | Нарушение авторских прав |