Вы здесь: HomeУмножение

Урок 5. Арифметические операции:умножение и деление

В этом уроке по языку ассемблер мы будем говорит об умножении и делении, обрабатывать числа будем как со знаком так и без него. Хочу заметить то что процессор работает только с целыми числам, и это конечно нужно знать и учитывать. Для работы с вещественными числами(числа с плавающей точкой) существует сопроцессор, о котором мы еще поговорим в следующих уроках. 

 

Умножение

Для умножения в ассемблере используется команда MUL, она принимает лишь одни параметр это множитель а множимое находиться в AX или в AL. Это зависит от размера множителя. К примеру мы хотим умножит содержимое AL на BL для этого нам нужно занести в эти младшие части зачернения и выполнить команду mul bl, результат будет в AX. А чтоб умножить слово на слово: mul bx, но в этом случае результат будет находиться в двух регистрах DX:AX. И еще уточним одну деталь перед умножением слов желательно обнулить DX, это можно сделать просто поместив в него ноль. Также умножать можно и на переменные. Давайте посмотрим на пример кода:

org 100h
mov ax,1111h
mov bx,0
mov al,2
mov bl,3
mul bl
mov dx,0
mov bx,0f002h
mul bx
mul [A]
mov ax,4c00h
int 21h
A db 2

 

Умножение ассемблер

Как мы видим с рисунка трассировки при умножении на AL на BL старшая часть регистра AX принимает новое значение а старое стирается. Также мы видим при умножении двух слов AX=6h и BX=0f002h  результатом будет шестнадцатеричное число 0005A00Ch которое не может поместиться в одном регистре, соответственно оно было помещено в два регистра. И последняя команда умножает переменную A на AL и результат соответственно будет в AX.

 Для того чтоб выполнить знаковое умножение ассемблер имеет команду IMUL. Она работает точно также как и mul только с учетом значка числа. К примеру давайте выполним такой пример 50*(-2)+101 и результат запишем в BX.

org 100h
mov al,-50
imul [A]
mov bx,101
add bx,ax
mov ax,4c00h
int 21h
A db 2

 

Умножение чисел со знаком на ассемблере

Деление 

 Для деление в ассемблере используется команда DIV. Она по своему принципу подобна и команде умножения. Единственно тут происходит не деление слова на слова а деление слова на байт и деление двойного слова на слово. При деление слова на байт а AX находиться делимое а после деления AH содержит остаток от деления а AL частное, то есть результат. При делении двойного слова на DX - содержит старшую часть числа а AX младшую после деления DX - содержит остаток а AX частное. Давайте рассмотрим пример кода:  

org 100h
mov dx,0
mov cx,0ffffh
mov ax,17
mov bl,2
div bl
mov ah,0
div [A]
mul cx
div cx
mov ax,4c00h
int 21h
A db 2

 

Деление в ассемблере

Как видно из рисунка выше мы делим 17(11h) на 2 в итоге у нас остаток 1 в старшей части регистра AX (подчеркнуто зеленым) и в младшей находится результат от деления. Затем обнуляем старшую часть регистра AX и потом делим на переменную а то что вышло умножаем на CX, предварительно обнулили регистр DX так как у нас получиться в результате двойное слова и старшая часть будет находиться в DX. В итоге при умножении 4h на ffffh мы имеем число  0003fffch  которое находиться в двух регистрах DX и AX затем мы это двойное слово делим на CX (ffffh) и как видим получили исходный результат в AX

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

org 100h
mov ax,-9
mov bl,-3
idiv bl
mov ax,-0ffh
mov cx,1234h
mov dx,0 
imul cx
mov cx,-1234h
idiv cx
mov ax,4c00h
int 21h  

 

На этом наш урок подошел к концу.  Надеюсь наши  ассемблер уроки Вам помогают в изучении языка.  Желаю Вам успехов.

Добавить комментарий


Защитный код
Обновить