В этом уроке по языку ассемблер мы будем говорит об умножении и делении, обрабатывать числа будем как со знаком так и без него. Хочу заметить то что процессор работает только с целыми числам, и это конечно нужно знать и учитывать. Для работы с вещественными числами(числа с плавающей точкой) существует сопроцессор, о котором мы еще поговорим в следующих уроках.
Умножение
Для умножения в ассемблере используется команда MUL, она принимает лишь одни параметр это множитель а множимое находиться в AX или в AL. Это зависит от размера множителя. К примеру мы хотим умножит содержимое AL на BL для этого нам нужно занести в эти младшие части зачернения и выполнить команду mul bl, результат будет в AX. А чтоб умножить слово на слово: mul bx, но в этом случае результат будет находиться в двух регистрах DX:AX. И еще уточним одну деталь перед умножением слов желательно обнулить DX, это можно сделать просто поместив в него ноль. Также умножать можно и на переменные. Давайте посмотрим на пример кода:
view source
print?
01
org100h
02
movax,1111h
03
movbx,0
04
moval,2
05
movbl,3
06
mul bl
07
movdx,0
08
movbx,0f002h
09
mul bx
10
mul [A]
11
movax,4c00h
12
int21h
13
A db2
Как мы видим с рисунка трассировки при умножении на AL на BL старшая часть регистра AX принимает новое значение а старое стирается. Также мы видим при умножении двух слов AX=6h и BX=0f002h результатом будет шестнадцатеричное число 0005A00Ch которое не может поместиться в одном регистре, соответственно оно было помещено в два регистра. И последняя команда умножает переменную A на AL и результат соответственно будет в AX.
Для того чтоб выполнить знаковое умножение ассемблер имеет команду IMUL. Она работает точно также как и mul только с учетом значка числа. К примеру давайте выполним такой пример 50*(-2)+101 и результат запишем в BX.
view source
1
org100h
2
moval,-50
3
imul [A]
4
movbx,101
5
addbx,ax
6
movax,4c00h
7
int21h
8
A db2
Деление
Деление
Для деление в ассемблере используется команда DIV. Она по своему принципу подобна и команде умножения. Единственно тут происходит не деление слова на слова а деление слова на байт и деление двойного слова на слово. При деление слова на байт а AX находиться делимое а после деления AH содержит остаток от деления а AL частное, то есть результат. При делении двойного слова на DX — содержит старшую часть числа а AX младшую после деления DX — содержит остаток а AX частное. Давайте рассмотрим пример кода:
view source
01
org100h
02
movdx,0
03
movcx,0ffffh
04
movax,17
05
movbl,2
06
divbl
07
movah,0
08
div[A]
09
mul cx
10
divcx
11
movax,4c00h
12
int21h
13
A db2
Как видно из рисунка выше мы делим 17(11h) на 2 в итоге у нас остаток 1 в старшей части регистра AX (подчеркнуто зеленым) и в младшей находится результат от деления. Затем обнуляем старшую часть регистра AX и потом делим на переменную а то что вышло умножаем на CX, предварительно обнулили регистр DX так как у нас получиться в результате двойное слова и старшая часть будет находиться в DX. В итоге при умножении 4h на ffffh мы имеем число 0003fffch которое находиться в двух регистрах DX и AX затем мы это двойное слово делим на CX (ffffh) и как видим получили исходный результат в AX.
Деление чисел со знаком осуществляется также как и без знака, предлагаю Вам выполнить трассировку кода ассемблера в отладчике:
view source
01
org100h
02
movax,-9
03
movbl,-3
04
idivbl
05
movax,-0ffh
06
movcx,1234h
07
movdx,0
08
imul cx
09
movcx,-1234h
10
idivcx
11
movax,4c00h
12
int21h
На этом наш урок подошел к концу. Надеюсь наши ассемблер уроки Вам помогают в изучении языка. Желаю Вам успехов.