Пильщиков
.pdf250 Программирование на языке ассемблера 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); отметим, что ПК действует именно по этому варианту.
"ДИАЛОГ-МИФИ•