Адресные команды
Команда leaзагружает эффективный адрес источника, т.е. его смещения относительно начала сегмента данных. Данная команда является альтернативой оператору ассемблераoffset(смещение). В отличие отoffsetкоманда lea допускает индексацию операнда, что позволяет более гибко организовать адресацию операндов.
Пример 6.11. Загрузить в регистр bx адрес пятого элемента массиваmas
.data
mas db 10 dup (0)
.code
...
mov di, 4
lea bx, mas[di]
;или
lea bx, mas[4]
;или
lea bx, mas+4
Команды lds/les/lgs/lfs/lss– загружают сегментный регистрds/es/gs/fs/ssуказателем из памяти. Например, командаlds di, pointerпомещает в пару регистровds:diадрес переменнойpointer.
Арифметические команды
Группа арифметических команд представлена в табл. 6.2. Эта группа делится на четыре части:
Таблица 6.2. Арифметические команды.
Мнемокод / Операнды |
Описание |
Команды сложения | |
aaa |
коррекция BCD-формата для сложения |
adc назначение, источник |
сложение с переносом |
add назначение, источник |
сложение байт или слов |
daa |
десятичная коррекция для сложения |
inc назначение |
инкремент |
Команды вычитания | |
aas |
коррекция BCD-формата для вычитания |
cmp назначение, источник |
сравнение |
das |
десятичная коррекция для вычитания |
dec назначение |
декремент |
neg назначение |
изменение знака числа |
sbb назначение, источник |
вычитание с учетом заема (флаг CF) |
sub назначение, источник |
вычитание |
Команды умножения | |
aam |
коррекция BCD-формата для умножения |
imul источник |
умножение величин со знаком |
mul источник |
беззнаковое умножение |
Команды деления | |
aad |
коррекция BCD-формата для деления |
cbw |
преобразование байта в слово |
cwd |
преобразование слова в двойное слово |
div |
беззнаковое деление |
idiv |
деление величин со знаком |
Примеры команд сложения:
add dl, 5 ;dldl+5
add ah, bh ;ahah+bh
adc ah, bh ;ahah+bh+cf
inc ah ;ahah+1
Существует специальный вид представления числовой информации, в основу которой положен принцип кодирования каждой десятичной цифры числа группой из четырех бит. Этот вид называется двоично-десятичным кодом (BCD–Binary-CodedDecimal). Процессор может хранитьBCD-числа в двух форматах: упакованном и неупакованном. В упакованном формате каждый байт может хранить числа в диапазоне от 00 до 99. В неупакованном формате в байт записываются числа в диапазоне от 0 до 9 (старшая тетрада байта всегда равна 0).
Пример 6.12. Сложение чисел. РезультатBCD-число.
mov ah,08h ;ah=08h
mov al,05h ;al=05h
add al,ah ;al=al+ah=05h+08h=0dh (=13) – не BCD-число
xor ah,ah ;ah=0
aaa ;ah=1, al=3 –результат скорректирован
Пример 6.13. СложениеBCD-чисел.
mov al,69h ;69h— упакованное BCD-число
mov bl,74h ;74h— упакованное BCD-число
adc al,bl ;al=0ddh (=143)
daa ;cf=1, al=43h
jc m1 ;если перенос, то переход на ту ветвь программы, где он будет учтен:
Далее мы не будем рассматривать BCD-числа.
Примеры команд вычитания:
sub dl, 5 ;dldl-5
sub ah, bh ;ahah-bh
dec ah ;ahah-1
neg ah ;ah-ah (вahпомещается двоичное дополнение)
cmp ax, bx ;выполняется вычитаниеax-bx, но результат вaxне изменяется)
Для умножения чисел без знака предназначена команда mul. Команда выполняет умножение двух операндов без учета знаков. Алгоритм зависит от формата операнда команды и требует явного указания местоположения только одного сомножителя, который может быть расположен в памяти или в регистре. Местоположение второго сомножителя фиксировано и зависит от размера первого сомножителя:
если операнд, указанный в команде — байт, то второй сомножитель должен располагаться в al;
если операнд, указанный в команде — слово, то второй сомножитель должен располагаться в ax;
Результат умножения помещается также в фиксированное место, определяемое размером сомножителей:
при умножении байтов результат помещается в ax;
при умножении слов результат помещается в пару dx:ax;
Пример 6.14.Умножение чисел
mn_1 db 15
mn_2 db 25
…
mov al, mn_1
mul mn_2 ;ax mn_1*mn_2