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

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

Умножение

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

view source

print?

01org 100h
02mov ax,1111h
03mov bx,0
04mov al,2
05mov bl,3
06mul bl
07mov dx,0
08mov bx,0f002h
09mul bx
10mul [A]
11mov ax,4c00h
12int 21h
13db 2

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

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

view sourceprint?

1org 100h
2mov al,-50
3imul [A]
4mov bx,101
5add bx,ax
6mov ax,4c00h
7int 21h
8db 2

Деление 

Деление 

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

view sourceprint?

01org 100h
02mov dx,0
03mov cx,0ffffh
04mov ax,17
05mov bl,2
06div bl
07mov ah,0
08div [A]
09mul cx
10div cx
11mov ax,4c00h
12int 21h
13db 2

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

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

view sourceprint?

01org 100h
02mov ax,-9
03mov bl,-3
04idiv bl
05mov ax,-0ffh
06mov cx,1234h
07mov dx,0 
08imul cx
09mov cx,-1234h
10idiv cx
11mov ax,4c00h
12int 21h  

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

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

Ваш адрес email не будет опубликован.