Вы здесь: HomeСложение

Урок 4. Арифметические операции: сложение и вычитание

Приветствую Вас на наших уроках по ассемблеру. Сегодня мы поговорим о арифметических операциях. Сразу хочу сказать о том что все наши дальнейшие уроки будут проходить с использованием FASM ассемблера, а не TASM как это было в первом и во втором. Особо сложного вы ничего не увидите при переходе на fasm. Связано это с тем что fasm поддерживается разработчика по сегодняшний день, что нельзя сказать про tasm. Также в сегодняшнем уроке нам понадобиться отладчик про который шла речь на прошлом уроке.

 Сложение и вычитание

Начнем пожалуй  с самого простого это сложение и вычитание. В ассемблере за них отвечают две команды это ADD и SUB. Они могут работать как переменными так и с регистрами процессора, а точнее можно сложить или вычесть регистр с регистром, регистр с памятью и наоборот. Пример программы на fasm:

org 100h
mov ax,1
mov bx,4
add ax,bx
add bx,[B]
mov cl,3
add cl,[A]
add [B],ax
mov ax,4c00h
int 21h
A db 2
B dw 3

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

 

В данном примере мы сначала в mov ax,1 заносим в ах регистр единицу затем в bx 4 и прибавляем к ax bx и результат сохраняется в ax. Так же я думаю Вы заметили что в нашей программе есть две переменные, переменная А размером в байт и переменная B размером в слово(два байта). Затем мы к bx прибавляем слово, то есть переменную B и результат соответственно будет в регистре bx. далее мы младшей части регистра cl присваиваем значение 3 и  прибавляем в следующей командой сложения переменную А, которая имеет размер один байт. И команда add [B],ax прибавляет к переменной B значение регистра ax, и результат будет в переменной B что мы и видим на рисунках выше.

Команда вычитания по действию нечем не отличаться от команды сложения. Вот пример кода, который Вы можете самостоятельно протрассировать на отладчике:

org 100h
mov ax,1
mov bx,7
sub bx,ax
sub bx,[B]
mov cl,3
sub cl,[A]
sub [B],ax
sub [B],2
mov ax,4c00h
int 21h
A db 2
B dw 4

Посмотрите на строчку кода sub [B],2 - тут происходит вычитание 2 с переменной B. Такие же действия можно проводить и со сложением. Данная команда также применима и к регистрам к примеру если Вам нужно прибавить к регистру ах 3 то это можно сделать таким образом: add ax,3

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

INC - увеличивает(прибавляет  единицу). DEC - уменьшает(вычитает единицу)

inc ax
dec bx
inc cl
dec ch
inc [A]
dec [B]

Как известно один байт имеет восемь бит, соответственно может вместит в себя  28= 256 символов. Если мы работаем с положительными (без знаковыми) данными то в байт может поместиться от  0 до 255. Ну а если мы работаем с данными которые могут быть как положительные так и отрицательные то один байт содержит от -128 до +127, а слово в свою очередь от -32768 до +32767. И во многих случаях это нужно учитывать. А теперь представим что нам нужно прибавить регистру bx отрицательное значение которое содержится в младшей части регистра ax. Соответственно прибавит так не получиться, так как bx имеет размер в слово а al в байт. И если просто прибавить к bx значение то что в al путем обнуления старшей части регистра ax и сложением этих двух регистров приведет к тому что отрицательное число с al будет принято за положительное (это было бы приемлемо для без знакового сложения но не для знакового). К примеру если в al=-5 то в регистре содержится число 251 и соответственно оно будет прибавлено к bx а не -5. Для решения этой проблемы существует команда CBW которая расширяет al до ax, к примеру:

mov al,-5
mov bx,8
cbw
add bx,ax

После выполнения этих действий можно увидеть что регистр bx будет равен трем что мы и видим на рисунке ниже.

Расширение до слова. Ассемблер уроки.

Пожалуй и все по поводу сложения и вычитания в ассемблере. До встречи на следующей статье ассемблер уроки. Желаю Вам успехов.

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


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