Скачиваний:
80
Добавлен:
15.06.2014
Размер:
289.98 Кб
Скачать

Язык ассемблера для процессоров

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