Язык ассемблера для процессоров
INTEL, 5-е издание
Кип Р. Ирвин
Глава 7: Целочисленная
арифметика
Слайды подготовил: Кип Р. Ирвин
Редакция: С.Б. Мусин
(c) Pearson Education, 2006-2007. All rights reserved. You may modify and copy this slide show for your personal use, or for use in the classroom, as long as this copyright statement, the author's name, and the title are not changed.
Обзор
•Команды сдвига
•Команды умножения и деления
•Сложение и вычитание чисел с произвольной точностью
•Десятичная арифметика
Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007. Web site Examples 2 Мусин С.Б., каф. ПОИТ, БГУИР, 2007 http://ppl.yohng.com.
|
Команды сдвига |
|
Логический и арифметический сдвиг |
|
||
• Логический и арифметический сдвиг |
|
• Логический сдвиг: свободный бит заполняется |
|
|||
|
нулем |
|
|
|||
• |
Команда SHL |
|
|
|
|
|
|
|
|
|
|
||
• |
Команда SHR |
|
|
0 |
|
|
|
|
|
|
|
|
|
• Команды SAL и SAR |
|
|
|
CF |
|
|
|
|
|
|
|
||
• |
Команда ROL |
|
|
• Арифметический сдвиг: знаковый бит повторяется |
||
• |
Команда ROR |
|
|
|||
|
|
|
|
|
||
• Команды RCL и RCR |
|
|
|
|
|
|
• |
Команды SHLD/SHRD |
|
|
|
|
|
|
|
|
|
|
CF |
|
Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007. |
Web site Examples |
3 |
Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007. |
Web site Examples |
4 |
|
Мусин С.Б., каф. ПОИТ, БГУИР, 2007 http://ppl.yohng.com. |
|
|
Мусин С.Б., каф. ПОИТ, БГУИР, 2007 http://ppl.yohng.com. |
|
|
Команда SHL
•Команда SHL (shift left) выполняет логический сдвиг влево, младший бит заполняется 0.
0
CF
• Типы операндов команды SHL:
SHL reg,imm8 |
(Совпадают для всех |
SHL mem,imm8 |
|
SHL reg,CL |
команд простого и |
SHL mem,CL |
циклического сдвига) |
Быстрое умножение
Сдвиг влево ~ умножение на 2
mov dl,5 |
Before: |
0 0 0 0 0 1 0 1 |
= 5 |
|
shl dl,1 |
|
|
= 10 |
|
After: |
0 0 0 0 1 0 1 0 |
|||
|
Сдвиг влево на n бит ~ умножение на 2n Например, 5 * 22 = 20
mov |
dl,5 |
; DL = 20 |
shl |
dl,2 |
Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007. |
Web site Examples |
5 |
Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007. |
Web site Examples |
6 |
Мусин С.Б., каф. ПОИТ, БГУИР, 2007 http://ppl.yohng.com. |
|
|
Мусин С.Б., каф. ПОИТ, БГУИР, 2007 http://ppl.yohng.com. |
|
|
1
Команда SHR
•Команда SHR (shift right) выполняет логический сдвиг вправо, старший разряд заполняется 0.
0
CF
Сдвиг вправо на n бит ~ деление операнда на 2n
mov dl,80 |
; DL = 40 |
|
shr dl,1 |
|
|
shr dl,2 |
; DL = 10 |
|
Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007. |
Web site Examples |
7 |
Мусин С.Б., каф. ПОИТ, БГУИР, 2007 http://ppl.yohng.com.
Команды SAL и SAR
•SAL (shift arithmetic left) совпадает с SHL.
•SAR (shift arithmetic right) выполняет арифметический сдвиг операнда вправо.
Арифметический сдвиг сохраняет знак.
mov dl,-80 |
; DL = -40 |
|
sar dl,1 |
|
|
sar dl,2 |
; DL = -10 |
|
Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007. |
Web site Examples |
8 |
Мусин С.Б., каф. ПОИТ, БГУИР, 2007 http://ppl.yohng.com.
Задача . . . |
|
Команда ROL |
|
||
Укажите 16-чное значение AL после каждого сдвига: |
|
• ROL (rotate) циклически сдвигает биты |
|
||
|
операнда влево |
|
|
||
|
|
|
|
|
|
mov al,6Bh |
|
|
• Старший бит выдвигается в младший бит и в |
|
|
a. 35h |
|
CF (Carry flag) |
|
|
|
shr al,1 |
|
|
|
||
shl al,3 |
b. A8h |
|
• Не “теряет” биты |
|
|
mov al,8Ch |
c. C6h |
|
|
|
|
sar al,1 |
|
|
|
|
|
sar al,3 |
d. F8h |
|
|
|
|
|
|
|
mov al,11110000b |
; AL = 11100001b |
|
|
|
|
rol al,1 |
|
|
|
|
|
mov dl,3Fh |
; DL = F3h |
|
|
|
|
rol dl,4 |
|
|
Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007. |
Web site Examples |
9 |
Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007. |
Web site Examples |
10 |
Мусин С.Б., каф. ПОИТ, БГУИР, 2007 http://ppl.yohng.com. |
|
|
Мусин С.Б., каф. ПОИТ, БГУИР, 2007 http://ppl.yohng.com. |
|
|
Команда ROR
•ROR (rotate right) циклически сдвигает биты операнда вправо
•Старший бит выдвигается в старший бит и в CF
•Не “теряет” биты
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
mov al,11110000b |
; AL = |
01111000b |
|
||||||||||||
ror al,1 |
|
||||||||||||||
mov dl,3Fh |
; DL = |
F3h |
|
||||||||||||
ror dl,4 |
|
||||||||||||||
Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007. |
|
Web site Examples |
11 |
Мусин С.Б., каф. ПОИТ, БГУИР, 2007 http://ppl.yohng.com.
Задача . . .
Укажите значение AL после выполнения каждой команды:
mov al,6Bh |
a. B5h |
ror al,1 |
|
rol al,3 |
b. ADh |
Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007. Web site Examples 12 Мусин С.Б., каф. ПОИТ, БГУИР, 2007 http://ppl.yohng.com.
2
Команда RCL
•RCL (rotate carry left) циклический сдвиг влево через CF
•Младший бит заполняется содержимым CF
•Старший бит заполняется из CF
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
clc |
; CF = 0 |
|
|
|
|
|
|||||
mov bl,88h |
; CF,BL = 0 10001000b |
|
|||||||||
rcl bl,1 |
; CF,BL = 1 |
00010000b |
|
||||||||
rcl bl,1 |
; CF,BL = 0 |
00100001b |
|
||||||||
Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007. |
Web site |
Examples |
13 |
Мусин С.Б., каф. ПОИТ, БГУИР, 2007 http://ppl.yohng.com.
Команда RCR
•RCR (rotate carry right) циклический сдвиг вправо через CF
•Старший бит заполняется из CF
•Младший копируется в CF
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
stc |
; CF = 1 |
00010000b |
|
|||||||
mov ah,10h |
; CF,AH = 1 |
|
||||||||
rcr ah,1 |
; CF,AH = 0 |
10001000b |
|
|||||||
Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007. |
Web site Examples |
14 |
||||||||
Мусин С.Б., каф. ПОИТ, БГУИР, 2007 |
http://ppl.yohng.com. |
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
|
|
Задача . . .
Укажите значение AL после выполнения каждой команды:
stc |
|
mov al,6Bh |
a. B5h |
rcr al,1 |
|
rcl al,3 |
b. AEh |
Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007. Web site Examples 15 Мусин С.Б., каф. ПОИТ, БГУИР, 2007 http://ppl.yohng.com.
Команда SHLD
•Выполняет сдвиг влево приемника на заданное число бит
•Освободившиеся биты приемника заполняются старшими битами источника
•Источник не изменяется
•Синтаксис (IA-32):
SHLD приемник, источник, количество_бит
• Типы операндов:
SHLD reg16/32, reg16/32, imm8/CL
SHLD mem16/32, reg16/32, imm8/CL
Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007. Web site Examples 16 Мусин С.Б., каф. ПОИТ, БГУИР, 2007 http://ppl.yohng.com.
Пример использования SHLD
Сдвиг wval на 4 бита влево с заполнением младших 4 бит старшими битами AX:
.data |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
wval WORD 9BA6h |
До: |
|
|
|
|
|
|
.code |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
mov ax,0AC36h |
После: |
|
|
|
|
|
|
shld wval,ax,4 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007. Web site Examples 17 Мусин С.Б., каф. ПОИТ, БГУИР, 2007 http://ppl.yohng.com.
Команда SHRD
•Выполняет сдвиг вправо приемника на заданное число бит
•Освободившиеся биты приемника заполняются младшими битами источника
•Источник не изменяется
•Синтаксис (IA-32):
SHRD приемник, источник, количество_бит
• Типы операндов:
SHRD reg16/32, reg16/32, imm8/CL
SHRD mem16/32, reg16/32, imm8/CL
Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007. Web site Examples 18 Мусин С.Б., каф. ПОИТ, БГУИР, 2007 http://ppl.yohng.com.
3
|
Пример использования SHRD |
|
|
Задача . . . |
|
|||||
Сдвиг AX на 4 бита вправо и замена старших 4 бит |
Укажите значение DX после выполнения сдвигов: |
|||||||||
|
|
|
|
|||||||
младшими битами DX: |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
mov |
ax,7C36h |
|
|
mov |
ax,234Bh |
|
|
|
|
|
mov |
dx,9FA6h |
|
|
mov |
dx,7654h |
До: |
|
|
|
|
shld dx,ax,4 |
; DX = |
FA67h |
|
shrd ax,dx,4 |
После: |
|
|
|
|
shrd dx,ax,8 |
; DX = |
36FAh |
||
|
|
|
|
|||||||
|
|
|
|
|
|
|
|
|
|
|
Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007. |
Web site Examples |
19 |
Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007. |
Web site Examples |
20 |
Мусин С.Б., каф. ПОИТ, БГУИР, 2007 http://ppl.yohng.com. |
|
|
Мусин С.Б., каф. ПОИТ, БГУИР, 2007 http://ppl.yohng.com. |
|
|
Сдвиг нескольких двойных слов
•Сдвиг массивов бит применяется для перемещения спрайтов на экране.
•Следующий пример выполняет сдвиг 3 двойных слов на 1 бит вправо (см. MultiShf.asm):
.data |
|
|
|
|
ArraySize = 3 |
|
|
; 1001 1001... |
|
array DWORD ArraySize DUP(99999999h) |
||||
.code |
|
|
|
|
mov esi,0 |
; high dword |
|
|
|
shr array[esi + 8],1 |
|
|
||
rcr array[esi + 4],1 |
; middle dword, include Carry |
|||
rcr array[esi],1 |
; low dword, include Carry |
|
||
Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007. |
Web site |
Examples |
21 |
Мусин С.Б., каф. ПОИТ, БГУИР, 2007 http://ppl.yohng.com.
Быстрое умножение
•Команда SHL выполняет эффективное умножение на степень 2.
•Любое число можно разложить на степени 2.
•Например, для вычисления произведения EAX * 36, следует разложить 36 как 32 + 4 и использовать дистрибутивный закон умножения:
EAX * 36 |
mov eax,123 |
|
|
|
= EAX * (32 + 4) |
mov ebx,eax |
; mult by 25 |
|
|
= (EAX * 32)+(EAX * 4) |
shl eax,5 |
|
|
|
|
shl ebx,2 |
|
; mult by 22 |
|
|
add eax,ebx |
|
|
|
Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007. |
Web site |
Examples |
22 |
|
Мусин С.Б., каф. ПОИТ, БГУИР, 2007 http://ppl.yohng.com. |
|
|
|
Задача . . .
Умножьте AX на 26, используя последовательность сдвигов и сложений. Подсказка: 26 = 16 + 8 + 2.
mov ax,2 |
; test value |
mov dx,ax |
; AX * 16 |
shl dx,4 |
|
push dx |
; save for later |
mov dx,ax |
; AX * 8 |
shl dx,3 |
|
shl ax,1 |
; AX * 2 |
add ax,dx |
; AX * 10 |
pop dx |
; recall AX * 16 |
add ax,dx |
; AX * 26 |
Отображение двоичного числа
Алгоритм: сдвинуть старший бит в CF; Если CF = 1, добавить "1“ к результирующей строке; иначе "0”. Повторить цикл 32 раза.
.data
buffer BYTE 32 DUP(0),0
.code
mov ecx,32
mov esi,OFFSET buffer L1: shl eax,1
mov BYTE PTR [esi],'0' jnc L2
mov BYTE PTR [esi],'1' L2: inc esi
loop L1
Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007. |
Web site Examples |
23 |
Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007. |
Web site Examples |
24 |
Мусин С.Б., каф. ПОИТ, БГУИР, 2007 http://ppl.yohng.com. |
|
|
Мусин С.Б., каф. ПОИТ, БГУИР, 2007 http://ppl.yohng.com. |
|
|
4
Выделение поля по маске
•MS-DOS хранит дату последнего изменения файла в упакованном виде (5700h, INT 21h):
Пример выделения поля «месяц»:
mov ax,dx |
; make |
a copy |
of DX |
||
shr ax,5 |
; shift |
right |
5 |
bits |
|
and al,00001111b |
; clear |
bits 4-7 |
variable |
||
mov month,al |
; save |
in month |
|||
Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007. |
Web site Examples |
25 |
Мусин С.Б., каф. ПОИТ, БГУИР, 2007 http://ppl.yohng.com.
Команда MUL
•Команда MUL выполняет умножение 8-, 16-, или 32-битного операнда без знака на AL, AX или EAX.
•Формат команды:
MUL r/m8
MUL r/m16
MUL r/m32
Множимое / Множитель / Произведение
Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007. Web site Examples 27 Мусин С.Б., каф. ПОИТ, БГУИР, 2007 http://ppl.yohng.com.
Команды умножения и деления
•Команда MUL
•Команда IMUL
•Команда DIV
•Деление целых чисел со знаком
•Команды CBW, CWD, CDQ
•Команда IDIV
•Реализация арифметических выражений
Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007. Web site Examples 26 Мусин С.Б., каф. ПОИТ, БГУИР, 2007 http://ppl.yohng.com.
Примеры
100h * 2000h, 16-битные операнды:
val1 WORD 2000h |
Флаг переноса CF |
|
val2 WORD 100h |
используется для |
|
определения |
||
.code |
|
разрядности |
mov ax,val1 |
|
результата. |
.data |
|
|
mul val2 |
; DX:AX = 00200000h, CF=1 |
|
12345h * 1000h, 32-битные операнды:
mov eax,12345h |
|
|
|
mov ebx,1000h |
|
|
|
mul ebx |
; EDX:EAX = 0000000012345000h, CF=0 |
|
|
Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007. |
Web site Examples |
28 |
Мусин С.Б., каф. ПОИТ, БГУИР, 2007 http://ppl.yohng.com.
Задача. . .
Определите DX, AX и CF после выполнения следующего фрагмента кода:
mov ax,1234h mov bx,100h mul bx
DX = 0012h, AX = 3400h, CF = 1
Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007. Web site Examples 29 Мусин С.Б., каф. ПОИТ, БГУИР, 2007 http://ppl.yohng.com.
Задача. . .
Определите EDX, EAX выполнения следующего фрагмента кода:
mov eax,00128765h mov ecx,10000h mul ecx
EDX = 00000012h, EAX = 87650000h, CF = 1
Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007. Web site Examples 30 Мусин С.Б., каф. ПОИТ, БГУИР, 2007 http://ppl.yohng.com.
5
Команда IMUL
•IMUL умножает 8-, 16или 32-битные целые числа со знаком на операнд в AL, AX или EAX
•Сохранение знака произведения обеспечивается расширением знака в старшей половине приемника
Пример: 48 * 4, 8-битные операнды:
mov |
al,48 |
|
|
|
mov |
bl,4 |
|
|
|
imul bl |
; AX = 00C0h, OF=1 |
|
||
OF=1, так как AH не является расширением знака AL. |
|
|||
Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007. |
Web site Examples |
31 |
||
Мусин С.Б., каф. ПОИТ, БГУИР, 2007 |
http://ppl.yohng.com. |
|
|
|
Пример |
4 823 424 * −423: |
|
mov eax,4823424 |
|
mov ebx,-423 |
; EDX:EAX = FFFFFFFF86635D80h, OF=0 |
imul ebx |
OF=0, так как EDX расширение знака EAX.
Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007. Web site Examples 32 Мусин С.Б., каф. ПОИТ, БГУИР, 2007 http://ppl.yohng.com.
Задача . . .
Определите содержимое DX, AX и CF после выполнения:
mov ax,8760h mov bx,100h imul bx
DX = FF87h, AX = 6000h, OF = 1
Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007. Web site Examples 33 Мусин С.Б., каф. ПОИТ, БГУИР, 2007 http://ppl.yohng.com.
Команда DIV
•Команда DIV выполняет деление целых чисел без знака
•8-, 16или 32 битный операнд является делителем
•Формат команды:
DIV r/m8
DIV r/m16
DIV r/m32
Делимое / Делитель /Частное / Остаток
Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007. Web site Examples 34 Мусин С.Б., каф. ПОИТ, БГУИР, 2007 http://ppl.yohng.com.
Примеры |
|
|
Задача. . . |
|
|||
8003h / 100h,16 бит: |
|
|
|
|
Определить DX и AX после выполнения: |
|
|
mov dx,0 |
; clear dividend, high |
|
|
|
|
|
|
mov ax,8003h |
; dividend, low |
|
|
mov dx,0087h |
|
|
|
mov cx,100h |
; divisor |
|
|
|
|
|
|
div cx |
; AX = 0080h, DX = 3 |
|
|
mov ax,6000h |
|
|
|
|
|
|
|
|
mov bx,100h |
|
|
|
|
|
|
|
div bx |
|
|
8003h / 100h, 32 бита: |
|
|
|
|
|
|
|
mov edx,0 |
; clear dividend, high |
|
|
DX = 0000h, AX = 8760h |
|
||
mov eax,8003h |
; dividend, low |
|
|
|
|
|
|
mov ecx,100h |
; divisor |
|
|
|
|
|
|
div ecx |
; EAX = 00000080h, DX = 3 |
|
|
|
|
|
|
Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007. |
Web site Examples |
35 |
|
Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007. |
Web site Examples |
36 |
|
Мусин С.Б., каф. ПОИТ, БГУИР, 2007 http://ppl.yohng.com. |
|
|
|
|
Мусин С.Б., каф. ПОИТ, БГУИР, 2007 http://ppl.yohng.com. |
|
|
|
|
|
|
|
|
|
|
6
Задача . . . |
|
Деление целых чисел со знаком |
|||||
Определить DX и AX после выполнения: |
• |
Предварительно необходимо выполнить |
|||||
|
|
расширение знака |
|||||
|
|
• Заполнить старшую часть операнда знаковым |
|||||
mov dx,0087h |
|
битом из младшей |
|||||
mov ax,6002h |
• |
Пример: |
|||||
mov bx,10h |
|
|
|
|
|
|
|
div bx |
|
|
|
|
|
|
|
Divide Overflow |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007. |
Web site Examples |
37 |
Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007. |
Web site Examples |
38 |
Мусин С.Б., каф. ПОИТ, БГУИР, 2007 http://ppl.yohng.com. |
|
|
Мусин С.Б., каф. ПОИТ, БГУИР, 2007 http://ppl.yohng.com. |
|
|
Команды CBW, CWD, CDQ
•Команды CBW, CWD и CDQ выполняют расширение знака операнда:
•CBW (convert byte to word) расширяет AL в AH
•CWD (convert word to doubleword) расширяет AX в DX
•CDQ (convert doubleword to quadword) расширяет EAX в EDX
•Пример:
mov |
eax,0FFFFFF9Bh |
; (-101) |
cdq |
; EDX:EAX = FFFFFFFFFFFFFF9Bh |
Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007. Web site Examples 39 Мусин С.Б., каф. ПОИТ, БГУИР, 2007 http://ppl.yohng.com.
Команда IDIV
•IDIV (signed divide) выполняет деление целых чисел со знаком
•Синтаксис аналогичен команде DIV Пример: 8-бит, –48 / 5
mov |
al,-48 |
; extend AL |
into |
AH |
cbw |
bl,5 |
|||
mov |
; AL = -9, |
AH = |
-3 |
|
idiv |
bl |
Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007. Web site Examples 40 Мусин С.Б., каф. ПОИТ, БГУИР, 2007 http://ppl.yohng.com.
|
|
Примеры |
|
|
|
|
Задача . . . |
|
||
Пример: 16-бит, –48 / 5 |
|
|
|
|
Определить DX и AX после выполнения: |
|
||||
mov |
ax,-48 |
|
|
|
|
|
|
|
|
|
cwd |
|
; extend AX into DX |
|
|
mov |
ax,0FDFFh |
; -513 |
|
||
mov |
bx,5 |
|
DX = -3 |
|
|
|
||||
idiv bx |
; AX = -9, |
|
|
|
cwd |
bx,100h |
|
|
||
|
|
|
|
|
|
|
mov |
|
|
|
|
|
|
|
|
|
|
idiv bx |
|
|
|
Пример: 32-бита, –48 / 5 |
|
|
|
|
|
|
|
|
||
mov |
eax,-48 |
|
|
|
|
DX = FFFFh (−1), AX = FFFEh (−2) |
|
|||
cdq |
|
; extend EAX into EDX |
|
|
|
|
|
|
||
mov |
ebx,5 |
|
EDX = -3 |
|
|
|
|
|
|
|
idiv ebx |
; EAX = -9, |
|
|
|
|
|
|
|||
Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007. |
Web site Examples |
41 |
|
Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007. |
Web site Examples |
42 |
||||
Мусин С.Б., каф. ПОИТ, БГУИР, 2007 |
http://ppl.yohng.com. |
|
|
|
|
Мусин С.Б., каф. ПОИТ, БГУИР, 2007 http://ppl.yohng.com. |
|
|
||
|
|
|
|
|
|
|
|
|
|
|
7
Арифметические выражения без знака
•Советы:
•Изучайте ассемблерный листинг после компиляции
•Разберитесь с командами MUL, IMUL, DIV, IDIV
•Не забывайте проверять флаги CF и OF
Пример: |
var4 = (var1 + var2) * var3 |
|
||
; Assume unsigned operands |
|
|
||
mov |
eax,var1 |
; EAX = var1 + var2 |
|
|
add |
eax,var2 |
|
||
mul |
var3 |
; EAX = EAX * var3 |
|
|
jc |
TooBig |
; check for carry |
|
|
mov |
var4,eax |
; save product |
|
|
Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007. |
Web site Examples |
43 |
Мусин С.Б., каф. ПОИТ, БГУИР, 2007 http://ppl.yohng.com.
Арифметические выражения со знаком (1 - 2)
Пример: |
eax = (-var1 * var2) + var3 |
|
mov |
eax,var1 |
|
neg |
eax |
|
imul |
var2 |
; check for overflow |
jo |
TooBig |
|
add |
eax,var3 |
; check for overflow |
jo |
TooBig |
Пример: |
var4 = (var1 * 5) / (var2 – 3) |
|
|
mov |
eax,var1 |
; left side |
|
mov |
ebx,5 |
; EDX:EAX = product |
|
imul |
ebx |
|
|
mov |
ebx,var2 |
; right side |
|
sub |
ebx,3 |
; EAX = quotient |
|
idiv |
ebx |
|
|
mov |
var4,eax |
|
|
Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007. |
Web site Examples |
44 |
Мусин С.Б., каф. ПОИТ, БГУИР, 2007 http://ppl.yohng.com.
Арифметические выражения со знаком (2 - 2)
Example: var4 = (var1 * -5) / (-var2 % var3);
mov |
eax,var2 |
; begin right side |
neg |
eax |
; sign-extend dividend |
cdq |
var3 |
|
idiv |
; EDX = remainder |
|
mov |
ebx,edx |
; EBX = right side |
mov |
eax,-5 |
; begin left side |
imul |
var1 |
; EDX:EAX = left side |
idiv |
ebx |
; final division |
mov |
var4,eax |
; quotient |
Иногда лучше начинать вычисления справа!
Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007. Web site Examples 45 Мусин С.Б., каф. ПОИТ, БГУИР, 2007 http://ppl.yohng.com.
Задача. . .
Напишите код на ассемблере для вычисления выражения (32-битные целые числа):
eax = (ebx * 20) / ecx
mov eax,20 imul ebx idiv ecx
Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007. Web site Examples 46 Мусин С.Б., каф. ПОИТ, БГУИР, 2007 http://ppl.yohng.com.
Задача . . .
Напишите код на ассемблере для вычисления выражения (32-битные целые числа). Сохраните значение в ECX и EDX:
eax = (ecx * edx) / eax
push |
edx |
; EAX needed later |
|
|
push |
eax |
|
||
mov |
eax,ecx |
|
|
|
imul |
edx |
; left side: EDX:EAX |
|
|
pop |
ebx |
; saved value of EAX |
|
|
idiv |
ebx |
; EAX = quotient |
|
|
pop |
edx |
; restore EDX, ECX |
|
|
Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007. |
Web site Examples |
47 |
||
Мусин С.Б., каф. ПОИТ, БГУИР, 2007 |
http://ppl.yohng.com. |
|
|
|
|
|
|
|
|
Задача . . .
Напишите код на ассемблере для вычисления выражения (32-битные целые числа). Не изменяйте других переменных, кроме var3:
var3 = (var1 * -var2) / (var3 – ebx)
mov |
eax,var1 |
|
|
|
mov |
edx,var2 |
|
|
|
neg |
edx |
; left side: EDX:EAX |
|
|
imul |
edx |
|
||
mov |
ecx,var3 |
|
|
|
sub |
ecx,ebx |
|
|
|
idiv |
ecx |
; EAX = quotient |
|
|
mov |
var3,eax |
|
|
|
Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007. |
Web site Examples |
48 |
||
Мусин С.Б., каф. ПОИТ, БГУИР, 2007 |
http://ppl.yohng.com. |
|
|
8
Сложение и вычитание чисел с произвольной точностью
•Арифметические операции с произвольной точностью
•Команда ADC
•Команда SBB
•Примеры
Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007. Web site Examples 49 Мусин С.Б., каф. ПОИТ, БГУИР, 2007 http://ppl.yohng.com.
Арифметические операции с произвольной точностью
•Разрядность чисел превышает (32 bits).
•Практически нет ограничений разрядности
•Вычисления производятся по шагам
•На каждом шаге на следующий транслируется значение флага переноса (CF).
Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007. Web site Examples 50 Мусин С.Б., каф. ПОИТ, БГУИР, 2007 http://ppl.yohng.com.
Команда ADC
•ADC (add with carry) суммирует операнд с текущим значением флага переноса.
•Синтаксис тот же что у ADD, SUB, итд.
•Пример
•Сложение (FFFFFFFFh + FFFFFFFFh), результат в EDX:EAX:
mov edx,0 |
|
mov eax,0FFFFFFFFh |
|
add eax,0FFFFFFFFh |
;EDX:EAX = 00000001FFFFFFFEh |
adc edx,0 |
Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007. Web site Examples 51 Мусин С.Б., каф. ПОИТ, БГУИР, 2007 http://ppl.yohng.com.
Пример
•Задача: Прибавить 1 к EDX:EAX
•EDX:EAX: 00000000FFFFFFFFh
•Сложение младших 32 бит и установка переноса.
•Сложение старших 32 бит и учет переноса.
mov edx,0 |
; set upper half |
|
mov eax,0FFFFFFFFh |
; set lower half |
|
add eax,1 |
; add |
lower half |
adc edx,0 |
; add |
upper half |
EDX:EAX = 00000001 00000000
Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007. Web site Examples 52 Мусин С.Б., каф. ПОИТ, БГУИР, 2007 http://ppl.yohng.com.
Команда SBB
•SBB (subtract with borrow) вычитает числа,
принимая во внимание возможный заем предыдущей SUB или SBB.
•Синтаксис:
•Аналогичен ADC
Пример
•Задача: Вычесть 1 из EDX:EAX
•EDX:EAX: 0000000100000000h
•Вычитание младших 32 бит, установка заем (Carry flag).
•Вычитание старших 32 бит, с учетом CF.
mov edx,1 |
; set upper half |
mov eax,0 |
; set lower half |
sub eax,1 |
; subtract lower half |
sbb edx,0 |
; subtract upper half |
EDX:EAX = 00000000 FFFFFFFF
Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007. |
Web site Examples |
53 |
Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007. |
Web site Examples |
54 |
Мусин С.Б., каф. ПОИТ, БГУИР, 2007 http://ppl.yohng.com. |
|
|
Мусин С.Б., каф. ПОИТ, БГУИР, 2007 http://ppl.yohng.com. |
|
|
9
Десятичная арифметика
•BCD-числа
•ASCII-числа
•Команда AAA
•Команда AAS
•Команда AAM
•Команда AAD
•Упакованные BCD-числа
•Команда DAA
•Команда DAS
Двоично-кодированные десятичные
числа
•Binary-coded decimal (BCD)
•Упакованные BCD-числа
•Неупакованные BCD-числа сохраняют 1 цифру на байт
•Например, 5 678:
05 06 07 08
4 байта
Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007. |
Web site Examples |
55 |
Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007. |
Web site Examples |
56 |
Мусин С.Б., каф. ПОИТ, БГУИР, 2007 http://ppl.yohng.com. |
|
|
Мусин С.Б., каф. ПОИТ, БГУИР, 2007 http://ppl.yohng.com. |
|
|
ASCII-числа
•Число представляется в виде ASCII-символов, сохраняет один символ на байт
•Пример, 5 678:
35 36 37 38
Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007. Web site Examples 57 Мусин С.Б., каф. ПОИТ, БГУИР, 2007 http://ppl.yohng.com.
Команда AAA
•AAA (ASCII adjust after addition) выполняет коррекцию после сложения ASCII-чисел с помощью ADD или ADC. Команда работает с регистром AL. Содержимое AH необходимо обнулить.
•Пример: '8' + '2'
mov |
ah,0 |
; AX = 0038h |
|
|
|
mov |
al,'8' |
|
|
||
add al,'2' |
; AX = 006Ah |
(adjust result) |
|
||
aaa |
ax,3030h |
; AX = 0100h |
|
||
or |
; AX = 3130h |
= '10' |
|
||
Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007. |
Web site Examples |
58 |
|||
Мусин С.Б., каф. ПОИТ, БГУИР, 2007 |
http://ppl.yohng.com. |
|
|
|
Команда AAS
•AAS (ASCII adjust after subtraction) выполняет коррекцию после вычитания SUB или SBB. Если требуется заем, то 1 вычитается из AH и AL приводится к диапазону 0-9
•Пример: '9‘ - '8'
mov ah,0 |
; AX = 0038h |
|
|
mov al,'8' |
|
||
sub al,'9' |
; AX = 00FFh |
|
|
aas |
; AX = FF09h, CF=1 |
|
|
or al,30h |
; AL = '9' |
|
|
Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007. |
Web site Examples |
59 |
Мусин С.Б., каф. ПОИТ, БГУИР, 2007 http://ppl.yohng.com.
Команда AAM
•AAM (ASCII adjust after multiplication) выполняет коррекцию после выполнения MUL. Умножение должно производится над BCD-числами.
mov bl,05h |
; first operand |
||
mov al,06h |
; second operand |
||
mul bl |
; AX |
= |
001Eh |
aam |
; AX |
= |
0300h |
Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007. Web site Examples 60 Мусин С.Б., каф. ПОИТ, БГУИР, 2007 http://ppl.yohng.com.
10