Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Пильщиков

.pdf
Скачиваний:
156
Добавлен:
09.05.2015
Размер:
6.35 Mб
Скачать

250 Программирование на языке ассемблера IBM PC Глава 1

r e a d b u f p r o c n e a r

 

 

 

 

 

 

 

 

 

 

 

 

 

push

 

ax

 

 

 

 

 

 

 

 

 

 

 

 

 

 

p u s h

dx

 

 

 

 

 

 

 

 

 

 

 

 

 

 

push

 

d s

 

 

 

 

 

 

 

 

 

 

 

 

 

 

mov

 

d x , c s

 

 

 

 

 

 

 

 

 

 

 

 

. mov

 

d s , d x

 

 

 

 

 

 

 

 

 

 

 

 

 

l e a d x , b u f - 2

; d s : d x - а д р е с b u f [ - 2 ]

 

 

 

 

mov

 

ah,0Ah

 

;

ввод строки

в буфер

(включая

E n t e r )

 

 

 

i n t

 

21h

 

 

 

 

 

 

 

 

 

 

 

 

 

 

c a l l

p r o c n l

 

;

курсор

на

новую

с т р о к у экрана

 

 

 

i n c

 

c s : s i z e b

;

в длине

у ч е с т ь E n t e r

 

 

 

 

 

mov

 

c s : p o s b , 0

;

с к о л ь к о

символов

ухе считано

из buf

 

 

 

pop

 

d s

 

 

 

 

 

 

 

 

 

 

 

 

 

 

pop

 

dx

 

 

 

 

 

 

 

 

 

 

 

 

 

 

pop

 

ax

 

 

 

 

 

 

 

 

 

 

 

 

 

 

r e t

 

 

 

 

 

 

 

 

 

 

 

 

 

 

r e a d b u f

endp

 

 

 

 

 

 

 

 

 

 

 

 

;

Очистка

буфера

ввода

с

клавиатуры

 

 

 

 

 

;

Обращение:

c a l l

p r o c f l u s h

 

 

 

 

 

 

 

;

Параметров

н е т

 

 

 

 

 

 

 

 

 

 

p r o c f l u s h p r o c f a r

 

 

 

 

 

 

 

 

 

 

 

 

push

 

ax

 

 

 

 

 

 

 

 

 

 

 

 

 

 

mov

 

c s : s i z e b , 0

;

очистка

buf

 

 

 

 

 

 

 

mov

 

c s : p o s b , 0

 

 

 

 

 

 

 

 

 

 

 

 

mov

 

ah,OCh

 

;

очистка

DOS-буфера

 

 

 

 

 

mov

 

a l , 0

 

 

 

 

 

 

 

 

 

 

 

 

 

 

i n t

 

21h

 

 

 

 

 

 

 

 

 

 

 

 

 

 

pop

 

ax

 

 

 

 

 

 

 

 

 

 

 

 

 

 

r e t

 

 

 

 

 

 

 

 

 

 

 

 

 

 

p r o c f l u s h

endp

 

 

 

 

 

 

 

 

 

 

 

;

Ввод

символа

пропуском или

б е з

пропуска

E n t e r )

 

;

Обращение:

c a l l

p r o c i n c h

 

 

 

 

 

 

 

;

На

в х о д е :

al

-

E n t e r

пропустить

( 0 )

или

выдать как символ ( 1 )

;

На

выходе:

al

-

введенный символ

( a h не

м е н я е т с я )

 

p r o c i n c h p r o c f a r

 

 

 

 

 

 

 

 

 

 

 

 

 

push

 

bx

 

 

 

 

 

 

 

 

 

 

 

p r i n c h l :

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

mov * b l , c s : p o s b

;

номер

п о с л е д н е г о

с ч и т а н н о г о

символа

 

 

 

i n c

 

b l

 

 

;

с л е д .

номер

 

 

 

 

 

 

 

 

 

 

Ввод-вывод. Прерывания

281

cmp

b l , c s : s i z e b

;

не последний символ буфера?

 

j b p r i n c h 2

 

 

 

 

 

 

j n e

p r i n c h i o

;

буфер не

с ч и т а в

до

конца?

 

orip

a l , 0

;

считывать

ля ковер

с т р о к и ( E n t e r ) ?

 

j n e p r i n c h 2

 

 

 

 

 

 

p r i n c h l O :

 

 

 

 

 

 

 

c a l l

r e a d b u f

;

доввод в

буфер

 

 

 

jmp

p r i n c h l

; п о в т о р и т ь

 

 

 

 

p r i n c h 2 :

 

 

 

 

 

 

 

лют

c e : p o s b , b l

; з а п о м н и т ь

номер

считываемого символа

 

mov

bh,О

 

 

 

 

 

 

mov

a l , c » : b u £ [ b x - 1 ]

; a l : - с и м в о л

 

 

 

p o p

bx

 

 

 

 

 

 

r e t

 

 

 

 

 

 

 

p r o c i n c h e n d p

• • • • • • • • • ^ • • • ^ • • ^ • • ^ • ^ • • • ( • • • • • • • • ж а ж в к в а а н а а а г и а а в а а в ж в в а н в а я в *

;

Ввод ц е л о г о

числа

(со знаком

и

б е з ) размером в

с л о в о

;

Обращение:

c a l l p r o c i n i n t

 

 

 

 

 

 

; На в х о д * : н е т

 

 

 

 

 

 

 

 

 

 

;

На выходе:

ах

-

введенное

число

 

 

 

p r o c i n i n t p r o c f a r

 

 

 

 

 

 

 

 

 

 

p u s h

Ьх

 

 

 

 

 

 

 

 

 

 

 

p u s h

cx

 

 

 

 

 

 

 

 

 

 

 

p u s h

dx

 

 

 

 

 

 

 

 

 

 

;

п р о п у с к пробелов

и

концов

с т р о к в н а ч а л е

 

 

p r i n i n t l :

 

 

 

 

 

 

 

 

 

 

 

 

 

mov

a l , 0

 

 

 

 

 

 

 

 

 

 

 

c a l l

p r o c i n c h

;

al

-

очередной

символ

пропуском E n t e r )

 

cmp

a l , '

'

 

;

пробел?

 

 

 

 

 

j e p r i n i n t l

 

 

 

 

 

 

 

 

 

; п р о в е р к а

на

знак

 

 

 

 

 

 

 

 

 

 

mov

d x , 0

 

 

;

dx

-

вводимое

число

 

 

 

mov

c x , 0

 

 

;

c h - 0

-

н е т цифры, c l " 0

-

плюс

 

cmp

a l , ' + '

 

 

 

 

 

 

 

 

 

 

j e p r i n i n t 2

 

 

 

 

 

 

 

 

 

 

cmp

a l ,

 

 

 

 

 

 

 

 

 

 

 

j n e p r i n i n t 3

 

 

 

 

 

 

 

 

 

mov

c l , l

 

 

;

c l - 1

-

минус

 

 

 

;

цикл по цифрам

 

 

 

 

 

 

 

 

 

p r i n i n t 2 :

 

 

 

 

 

 

 

 

 

 

 

 

 

mov

a l , l

 

 

 

 

 

 

 

 

 

 

 

c a l l

p r o c i n c h

;

al

-

очередной

символ

( E n t e r - символ)

•ДИАЛОГ-МИФИ"

252 Программирование на языке ассемблера IBM PC Глава 1

p r i n i n t 3 :

 

 

 

;

проверка ва

цифру

 

 

 

 

cmp

a l , ' 9 '

 

 

 

 

 

 

 

 

 

 

 

 

ja p r i n i n t 4

; > ' 9 ' 7

 

 

 

 

 

 

 

sub

a l , ' 0 '

 

 

 

 

 

 

 

 

 

 

 

 

jb pri . ni . nt4

;

< ' 0 '

?

 

 

 

 

 

 

 

mov

c h , l

;

c h - 1

-

е с т ь

цифра

 

 

 

 

mov

a b , 0

 

 

 

 

 

 

 

 

 

 

 

 

mov

b x , a x

;

bx

-

цифра к а к

число

 

 

 

п о т

a x , d x

;

ах

-

предыдущее число

 

 

mul

c a : p r t e n

;

*10

 

 

 

 

 

 

 

 

 

jc

p r o v f l

;

>FFFFh

(dx<>0)

- >

переполнение

 

 

add

a x , b x

;

-(-цифра

 

 

 

 

 

 

 

j c p r o v f l

 

 

 

 

 

 

 

 

 

 

 

 

mov

d x , a x

;

с п а с т и

число

в

dx

 

 

 

 

jmp

p r i n i n t 2

;

к с л е д .

символу

 

 

; кончились цифры (число

в

d x )

 

 

 

 

 

 

p r i n i n t 4 :

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

mov

a x , d x

 

 

 

 

 

 

 

 

 

 

 

 

cmp

c h , l

;

били

цифры?

 

 

 

 

 

 

j n e p r n o d i g

 

 

 

 

 

 

 

 

 

 

 

 

cmp

c l , l

;

был

 

минус?

 

 

 

 

 

 

j n e p r i n i n t S

 

 

 

 

 

 

 

 

 

 

 

 

cmp

a x , 8 0 0 0 h

;

модуль

о т р и ц .

числа

> 8000h ?

 

 

j a p r o v f l

 

 

 

 

 

 

 

 

 

 

 

 

neg

ax

;

в з я т ь с

минусом

 

 

p r i n i n t S :

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

pop

dx

;

выход

 

 

 

 

 

 

 

pop

cx

 

 

 

 

 

 

 

 

 

 

 

 

pop

bx

 

 

 

 

 

 

 

 

 

 

 

 

r e t

 

 

 

 

 

 

 

 

 

 

 

 

 

p r t e n

dv

10

 

 

 

 

 

 

 

 

 

 

 

;

 

 

 

р е а к ц и я на

ошибки

 

при в в о д е

ч и с л а

 

p r o v f l :

l e a

 

c x , p r m s g o v f l

;

переполнение

 

 

 

 

 

jmp

p r e r r

 

 

 

 

 

 

 

 

 

 

p r n o d i g :

l e a c x , p r m s g n o d i g

;

н е т

цифр

 

 

 

 

p r e r r :

push

cs

;

п е ч а т ь

сообщения

об

ошибке

 

 

pop

ds

;

 

d s - c s

 

 

 

 

 

 

 

l e a d x , p r m s g

 

 

 

 

 

 

 

 

 

 

 

 

mov

a h , 9

;

 

o u t s t r

 

 

 

 

 

 

 

i n t

21h

 

 

 

 

 

 

 

 

 

 

 

 

mov

d x , c x

 

 

 

 

 

 

 

 

 

 

 

 

mov

a h , 9

;

 

o u t s t r

 

 

 

 

 

 

 

i n t

21h

 

 

 

 

 

 

 

 

 

 

c a l l p r o c n l

Ввод-вывод. Прерывания 254

mov

ah,4Ch

; f i n i s h

i n t

21h

 

prmsg d b

'Ошибка

при вводе ч и с л а : ' , ' $ '

p r m s g o v f 1 d b ' п е р е п о л н е н и е ' , ' $ ' p r m s g n o d i g d b ' н е т ц и ф р ы ' , ' $ '

p r o c i n i n t

endp

i o c o d e e n d s

e n d

; конец модуля i o p r o c

133.3.Текст файла IO.ASM

. x l i s t

; з а п р е т

записи э т о г о файла в л и с т и н г

;

Файл

с макросами в в о д а - в ы в о д а ,

подключаемый к

;

программе по

директиве: i n c l u d e

i o . a s m

;ОКОНЧАНИЕ СЧЕТА ПРОГРАММЫ

; Окончание с ч е т а программы

;обращение: f i n i s h

; на в х о д е :

al - код завершения

(можно и г н о р и р о в а т ь )

f i n i s h m a c r o

 

mov

ah,4Ch

 

i n t

21h

 

endm

 

 

;

ВЫВОД НА ЭКРАН (в

т е к с т о в о м режиме)

; Переход на новую строху

;обращение: n e w l i n e

e x t r n p r o c n l : f a r n e w l i n e macro

c a l l p r o c n l endm

;Вывод символа

;

обращение:

o u t c h с

;

г д е с - i 8 ,

г8 или ш8

•ДИАЛОГ-МИФИ"

254 Программирование на языке ассемблера IBM PC Глава 1

o u t c h macro с

push

dx

push

ax

mov

d l , c

mov

a h , 2

i n t

21h

pop

ax

pop

dx

endm

 

;

Вывод

строки

символов

 

 

 

 

 

 

 

 

 

;

 

 

обращение:

o u t s t r

 

 

 

 

 

 

 

 

;

 

 

на

в х о д е :

d s : d x

-

начальный

а д р е с

с т р о к и

 

;

 

 

(в конце

с т р о к и

д . б .

символ

$,

код

36 ( 2 4 Ь ) )

o u t s t r

macro

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

push

ах

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

mov

a h , 9

 

 

 

 

 

 

 

 

 

 

 

 

 

 

i n t

21h

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

pop

ax

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

endm

 

 

 

 

 

 

 

 

 

 

 

 

 

 

;

Вывод

целого

со

з н а к о м

размером

в

слово

 

 

;

 

 

обращение:

o u t i n t

num

[ , l e n g ]

 

 

 

;

 

 

г д е

num

-

выводимое

ч и с л о :

i l 6 ,

r l 6 , ml6

 

;

 

 

 

l e n g

-

ширина

поля

вывода:

i 8 ,

r 8 , m8

( с о значением > - 0 )

;

Особенности

вывода:

 

 

 

 

 

 

 

 

 

;

если

 

поле

больше,

чем

н а д о ,

то

с л е в а

добавляются

пробелы,

;

если

 

меньше

-

выводится

т о л ь к о

число

(целиком);

 

;

по умолчание

l e n g - 0

 

 

 

 

 

 

 

 

 

e x t r a p r o c o u t n u m : f a r

 

 

 

 

 

 

 

 

 

 

o u t i n t

macro n u m , l e n g

 

 

 

 

 

 

 

 

 

 

 

outnum

< n u m > , < l e n g > , l

 

 

 

 

 

 

 

 

 

endm

 

 

 

 

 

 

 

 

 

 

 

 

 

 

;

Вывод

целого

б е з з н а к а

размером

в

слово

 

 

;

обращение:

 

o u t w o r d

в и т

[ , l e n g ]

 

 

 

 

;

 

 

пит

и

l e n g

-

к а к

в o u t i n t

 

 

 

 

 

o u t v o r d

 

macro

п и т , l e n g

 

 

 

 

 

 

 

 

 

 

 

 

outnum

< n u m > , < l e n g > , 0

 

 

 

 

 

 

 

 

 

endm

 

 

 

 

 

 

 

 

 

 

 

 

 

Ввод-вывод. Прерывания

255

; Вспомогательный макрос п р о в е р к и написания имени

;разными (большими и малыми) буквами

same

m a c r o

n a m e , v a r i a n t s , a n s

 

 

 

a n s = 0

 

 

 

 

 

i r p v , < v a r i a n t s >

 

 

 

 

i f i d n <name>,<v>

 

 

 

 

a n s - 1

 

 

 

 

 

e x i t m

 

 

 

 

 

e n d i f

 

 

 

 

 

endm

 

 

 

 

 

endm

 

 

 

 

; Вспомогательный макрос для

o u t i n t ( s i g n = l ) и o u t w o r d ( - 0 )

outnum

m a c r o

num, l e n g , s i g n

 

 

 

 

l o c a l r e g d x ?

 

 

 

 

p u s h

 

ax

 

 

 

 

p u s h

 

dx

 

 

 

 

same

 

<num>,<dx,DX,Dx,dX>,regdx?

 

 

i f r e g d x ?

; ; o u t d x , l e n g — >

 

i f b

< l e n g >

; ;

mov

a l , l e n g

 

mov

a l , 0

; ;

xchg

a x , d x

 

e l s e

 

 

 

 

 

 

mov

a l , l e n g

 

 

 

 

e n d i f

 

 

 

 

 

x c h g

 

a x , d x

 

 

 

 

e l s e

 

 

; ; o u t n u m , l e n g ( n u m o d x ) — >

 

i f b

<leng>

; ;

mov

d l , l e n g

 

mov

d l , 0

;;

mov

ax,num

 

e l s e

 

 

 

 

 

 

mov

d l , l e n g

 

 

 

 

e n d i f

 

 

 

 

 

mov

ax,num

 

 

 

 

e n d i f

 

 

 

 

 

mov

d h , s i g n

 

 

 

 

c a l l p r o c o u t n u m

; ; a x = n u m , d l = l e n g , d h = s i g n

 

p o p

dx

 

 

 

 

p o p

ax

 

 

 

endm

•ДИАЛОГ-МИФИ"

256 Программирование на языке ассемблера IBM PC Глава 1

;

ВВОД С КЛАВИАТУРЫ

; Очистка буфера ввода с клавиатуры

;обращение: f l u s h

e x t r n p r o c f l u s h : f a r f l u s h macro

c a l l p r o c f l u s h endm

;

Ввод

символа

пропуском

концов с т р о к , т .

е .

E n t e r )

;

обращение:

i n c h

х

 

 

 

;

 

г д е х - r 8 , т 8

 

 

 

;

на выходе:

х

-

введенный

символ

 

 

e x t r n p r o c i n c h : f a r

 

 

 

 

i n c h

macro

x

 

 

 

 

 

 

 

l o c a l r e g a x ?

 

 

 

 

 

same

 

< x > , < a h , A H , A h , a H > , r e g a x ?

 

 

 

 

i f r e g a x ?

 

 

 

 

 

 

xchg

 

a h , a l

 

; ; x = a h

 

 

 

 

mov

a l , 0

 

 

 

 

 

 

 

c a l l p r o c i n c h

 

 

 

 

 

xchg

 

a h , a l

 

 

 

 

 

 

e l s e

 

 

 

 

 

 

 

 

 

same

 

< x > , < a l , A L , A l , a L > , r e g a x ?

 

 

 

 

i f r e g a x ?

 

 

 

 

 

 

mov

a l , 0

 

 

; ; x » a l

 

 

 

 

c a l l p r o c i n c h

 

 

 

 

 

e l s e

 

 

 

 

 

 

 

 

 

p u s h

 

ax

 

 

; ; x - не ah и

не

al

 

 

mov

a l , 0

 

 

 

 

 

 

 

c a l l p r o c i n c h

 

 

 

 

 

mov

x , a l

 

 

 

 

 

 

 

pop

ax

 

 

 

 

 

e n d i f e n d i f endm

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Ввод-вывод. Прерывания

257

;

Ввод

ц е л о г о

числа

(со

знаком и

 

б е з )

размером

в слово

 

 

;

обращение:

 

i n i n t

х

 

 

 

 

 

 

 

 

 

 

 

;

 

г д е

х

- г 1 6 ,

п>16

 

 

 

 

 

 

 

 

 

 

;

на выходе:

 

х - в в е д е н н о е ч и с л о

 

 

 

 

 

 

 

 

 

; о с о б е н н о с т и в в о д а :

 

 

 

 

 

 

 

 

 

 

 

;

 

пропускаются

в с е

пробелы

 

и

концы

строк

перед числом;

 

;

 

число

должно

н а ч и н а т ь с я

с

цифры,

перед

ней возможен

з н а к ;

 

;

 

при

минусе

чиоло

в в о д и т с я

как

о т р и ц а т е л ь н о е ;

 

 

;

 

ввод

идет

до

первой нецифры

т . ч . до

E n t e r ) , она

г л о т а е т с я ;

;

 

при

ошибке

б у д е т

п е ч а т ь

сообщения

и

о с т а н о в программы;

 

;

ошибки:

"нет цифры" -

в ч и с л е

н е т

ни

одной

цифры

 

 

;

 

"переполнение" - большое по модулю число

 

 

;

 

(вне

о т р е з к а

[ - 3 2 7 6 8 , + 6 5 5 3 5 ] )

 

 

 

 

 

 

e x t r n p r o c i n i n t : f a r

 

 

 

 

 

 

 

 

 

 

 

 

i n i n t

macro

 

x

 

 

 

 

 

 

 

 

 

 

 

 

 

 

l o c a l r e g a x ?

 

 

 

 

 

 

 

 

 

 

 

 

 

same

< x > , < a x , A X , A x , a X > , r e g a x ?

 

 

 

 

 

 

 

 

i f r e g a x ?

 

 

 

 

 

 

 

 

 

 

 

 

 

 

c a l l p r o c i n i n t

 

 

; ; x = a x

 

 

 

 

 

 

 

 

e l s e

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

p u s h a x

 

 

 

; ; x o a x

 

 

 

 

 

 

 

c a l l p r o c i n i n t

 

 

 

 

 

 

 

 

 

 

 

 

mov

x , a x

 

 

 

 

 

 

 

 

 

 

 

 

 

 

pop

ax

 

 

 

 

 

 

 

 

 

 

 

 

 

e n d i f endm

; в о с с т а н о в и т ь з а п и с ь в л и с т и н г :

. l i s t

•ДИАЛОГ-МИФИ"

Глава 11

ДОПОЛНИТЕЛЬНЫЕ возможности

Вэтой главе рассматриваются те команды ПК и средства ЯА, которые относительно редко используются на практике и которые не были рассмотрены в предыдущих главах книги.

14.1.Двоично-десятичные числа

Вгл. 1 уже отмечалось; что в ПК помимо целых чисел, представленных в двоичной системе счисления (двоичных чисел), используются и двоично-десятичные числа (binary coded decimal, BCD). В этом разделе рассматриваются команды ПК, предназначенные для реализации арифметических операций над такими числами.

14.1.1.Представление двоично-десятичных и ASCII-чисел

Напомним, что машинное представление двоично-десятичных чисел строится по следующему правилу: каждая цифра из десятичной записи (неотрицательного) Целого числа заменяется на четверку битов, изображающих эту цифру в двоичной системе счисления. Соответствие между десятичными цифрами и четверками битов следующее:

10

2

10

' 2

 

 

 

 

0

0000

5

0101

1

0001

6

0110

2

0010

1

0111

3

0011

8

1000

4

0100

9

1001

На каждое двоично-десятичное число отводят соседние байты памяти - столько, сколько надо. Порядок, в котором цифры числа занимают эти банты, вообще говоря, не фиксируется и определяется программистом. Дело в том, что обработка этих чисел ведется по цифрам и переход от цифры к цифре организует сам программист, а он может с одинаковым успехом переходить от очередного байта как к следующему байту, так и к предыдущему. Но для определенности мы в дальнейшем будем располагать левые (старшие) цифры числа в бантах с меньшими адресами, а правые цифры - с большими.

В ПК используются два формата представления двоично-десятичных чисел - упакованный и неупакованный. При упакованном формате в каждый байт запи-

сываются

две соседние

цифры

числа (при нечетном количестве цифр

слева

к числу

приписывается

0), а

при неупакованном формате в каждом

байте

размещается только одна цифра, которая прижимается к правому краю банта. Ниже .приведены представления числа 592 в упакованном (слева) и неупакованном форматах (А - адрес первого из байтов, занятых числом):

Дополнительные возможности

259

В ЯА переменные, значения которых трактуются как двоично-десятичные числа, можно описать по директиве DB с несколькими операндами:

PACK DB 5 h , 92h ;число 592 в упакованной виде UNPACK DB 5, 9, 2 ;число 592 в неупакованном виде

Обратите внимание, что для упакованного числа в одном операнде надо указывать две цифры, причем указывать их в шестнадцатеричной системе, чтобы каждая из цифр при трансляции заменялась на соответствующую четверку битов независимо от другой цифры (если в качестве операнда указать десятичное число 92, тогда оно заменится на 0101100Ь, а не на 10010010b).

В реальных программах двоично-десятичные числа редко выписываются явно. Они обычно получаются из так называемых ASCII-чисел - из числовых строк, из записи чисел в виде символьных строк (например, '592'), и в конце снова преобразуются в такие строки. Эти преобразования реализуются очень просто: поскольку в системе кодировки ASCII символы-цифры от '0' до '9' имеют коды от 30h до 39h, то для преобразования цифры-символа в цифру-число надо лишь выделить 4 правых бита из кода этого символа, а для обратного преобразования цифру-число надо сложить (арифметически или логически) с 30h.

14.1.2.Сложение двоично-десятичных чисел

Теперь рассмотрим, как реализуются арифметические операции над двоичнодесятичными числами. Начнем со сложения.

Сложение неупакованных двоично-десятичных чисел

В ПК нет команды сложения двоично-десятичных чисел как единых объектов, поэтому такие числа приходится складывать по цифрам: сначала складывают последние (младшие) цифры, затем - предпоследние и т. д. При этом, учитывая специфику представления таких чисел, при сложении двух их цифр приходится особым образом устанавливать, есть ли перенос в старшие цифры и какую цифру надо записать в соответствующую позицию числа-результата. Здесь возможны два случая. Если сумма двух цифр не превосходит 9 (например, 2+3=5=00000101Ь), тогда переноса в старшие цифры нет (в флаг переноса CF надо записать 0), а в качестве цифры результата надо взять получившуюся величину. Но если сумма цифр больше 9 (5+8=13=00001101Ь), тогда перенос в старшие цифры есть и его надо запомнить в флаге CF, а в результат надо записать величину, которая на 10 меньше полученной суммы. В последнем случае можно поступить и иначе: надо к сумме цифр прибавить 6 и затем обнулить левую половину байта (13+6=19=0001001 lb -> 0000001 lb=3); отметим, что ПК действует именно по этому варианту.

"ДИАЛОГ-МИФИ•

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]