Лабораторная работа №3 использование арифметических команд. Ввод операндов с клавиатуры и вывод результата на экран Теоретические сведения
Арифметические команды.
Используются для выполнения арифметических операций над целыми двоичными числами со знаком и без знака, над двоично-десятичными числами в упакованном и распакованном форматах. Знаковые двоичные числа могут занимать байт или слово и находиться в диапазоне –128…127 и –32768…32767 соответственно. Беззнаковые двоичные числа могут принимать значения из диапазона 0…255 (байты) 0…65535 (слова).
Команды обработки десятичных чисел нами рассматриваться не будут.
В результаты выполнения большинства арифметических команд устанавливаются флаги. Например, флаг ZF устанавливается в 1, если результат операции нулевой. Флаг CF устанавливается в 1, если при сложении чисел без знака возник перенос единицы за пределы старшего бита результата или при заимствовании единицы при нахождении разности чисел. Флаг OF устанавливается в 1, если при выполнении арифметической операции возникает переполнение, то есть результат выходит за пределы диапазона. Флаг PF устанавливается в 1, если младшие 8 бит результата содержат четное количество двоичных единиц. Флаг SF устанавливается в 1, если результат отрицательный.
Команды сложения.
1) add приемник, источник – команда сложения
Источник складывается и приемником, результат помещается в приемник.
mov ax,5
add ax,10 ;в результате ax=15
2) adc приемник, источник – команда сложения с переносом
Источник складывается и приемником и со значением флага CF, результат помещается в приемник.
Данная команда используется для сложения больших чисел, располагающихся в нескольких ячейках. Такие числа складываются с помощью нескольких команд сложения, начиная с младшей части с помощью команды ADD, а остальные с помощью команды ADC.
3) inc операнд – инкрементирование, то есть увеличение на 1
Значение операнда увеличивается на 1. В отличие от команд ADD и ADC, флаг СF не устанавливается.
mov сx,5
inc cx ;в результате cx=6
Команды вычитания.
1) SUB приемник, источник – команда вычитания
Из приемника вычитается источник, результат помещается в приемник.
mov ax,15
sub ax,10 ;в результате ax=5
2) SBB приемник, источник – команда вычитания с переносом
Из приемника вычитается источник и значение флага CF, результат помещается в приемник
Данная команда используется для вычитания больших чисел, аналогично сложению с переносом.
3) DEc операнд – декрементирование, то есть уменьшение на 1
Значение операнда уменьшается на 1. Флаг СF не изменяется.
mov сx,5
dec cx ;в результате cx=4
4) NEG приемник – число, противоположное приемнику, записывается в приемник
При выполнении сложения и вычитания ассемблер не различает числа со знаком и без знака. Он просто складывает соответствующие разряды чисел и, при необходимости, значение флага CF. Знаковая интерпретация является прерогативой программиста.
Команды умножения
1) MUL операнд – умножение чисел без знака
Второй операнд подразумевается по умолчанию. Правила умножения:
если операнд – байт, то операнд из команды умножается на значение, находящееся в регистре AL, а результат помещается в AX;
если операнд – слово, то операнд из команды умножается на значение, находящееся в регистре AХ, старшее слово результата помещается в DX, а младшее – в АХ;
в качестве операнда не может быть задано непосредственное значение, а только регистр или ячейка памяти.
Значения флагов CF и OF равны 0, если результат умножения получился маленький, то есть той же длины, что и сомножители. Иначе эти флаги устанавливаются в 1.
a dw 5
b dw 6
...
mov ax, a
mul b ;в результате ах=30
2) IMUL операнд – умножение чисел со знаком
Команды деления
1) DIV операнд – деление чисел без знака
Операнд в команде – это делитель. Делимое задается неявно по умолчанию, аналогично умножению. Правила деления:
если операнд – байт, то значение, находящееся в регистре AХ, делится на операнд, результат помещается в AL, а остаток – в AH;
если операнд – слово, то значение, находящееся в регистрах DX:AХ делится на операнд, результат помещается в AX, а остаток – в DX;
в качестве операнда не может быть задано непосредственное значение, а только регистр или ячейка памяти.
a db 50
b db 10
...
mov ah, 0
mov al, a
div b ;в результате аl=5, ah=0
При делении на 0 либо если частное превышает возможный размер (не помещается в отведенное для него место), возникает ошибка «Деление на 0» («Zero divide») и аварийное завершение программы.