83-сурет. Программаның орындалу нәтижесі
Оналтылық санау жүйесінде байттың мәнін шығару Есептеу әдісінің алгоритмі:
DH регистрінде баспаға беретін байт орналассын және
«0123456789ABCDEF» символдар кестесі берілсін. Байт екі оналтылық цифрдан тұрады. Осыны ескере отырып, есепті ке- лесідей етіп шешеміз: осы кестеден баспаға екі символды шыға- рамыз. Алдымен, санның үлкен жарты байтына тең болатын символды, ал одан кейін кіші жарты байтқа тең символды шыға- рамыз. Есепті шешу барысында екі мәселені қарастырамыз:
- AL регистріне қажетті нөмірлі символды жазамыз. Ығыс-
тыруы бар жанама регистрлік адресациялау режимін қол- данамыз;
- әр жарты байттың мәнін BX регистріне жазамыз.
156
1
|
2
|
@2: int 21h
|
; символды шақыру, үзуді орындау
|
LOOP @1
|
; @1 белгісіне көшу
|
int 21h
|
; үзуді орындау – символды шақыру
|
end begin
|
; программа кодының аяқталу белгісі
|
Ескерту: берілген талдау әдісінде санның бастапқы мәні тү- сіп қалады. Басқа жағдайда, ROL командасын пайдалануға бо- лады, бірақ байт үшін 8 рет.
Байттың мәнін ондық санау жүйесінде баспаға беру
Орындалу әдістемесі
Баспаға беретін байттың мәнін DH регистріне жазамыз. Бі- рақ қазір цифр символын экранға шығарудың басқа әдісін қа-
157
Есепті шешудің қарапайым әдісі
Мысал:
org 100h
|
; СОМ – файлдың басталуы
|
begin:
|
; программа кодының басталу белгісі
|
mov dh, 10
|
; dh регистріне 10 санын жазамыз
|
mov bl, dh
|
; bl регистріне 10 жазамыз
|
xor bh, bh
|
; вх нөлге теңестіреміз
|
and bl, 0F0h
|
; dh-ті 0f0h-ға логикалық (биттік) көбейту орындаймыз
|
shr bl, 4
|
; 4 битке оң жаққа қарай ығыстырамыз
|
mov al, table [bx]
|
; al регистріне мәліметтер жолын енгіземіз
|
int 29h
|
; үзуді шақыру, символды шақыру
|
mov bl, dh
|
; bl регистріне dh регистрінің мәнін жаза- мыз
|
and bl, 0Fh
|
; dh регистрін 0fh логикалық (биттік) кө- бейту орындаймыз
|
mov al, table [bx]
|
; al регистріне мәліметтер жолының мәнін енгіземіз
|
int 29h
|
; үзуді шақырамыз, символды шақыру
|
mov al, 13
|
; al регистріне 13 санын жазамыз
|
int 29h
|
; үзуді шақырамыз, символды шақыру
|
mov al, 10
|
; al регистріне 10 санын жазамыз
|
int 29h
|
; үзуді шақырамыз, символды шақыру
|
ret
|
; «программаны аяқтау» функциясы
|
table db '0123456789ABCDEF'
|
; баспаға беретін мәліметтерден тұратын жол
|
end begin
|
; программа кодының аяқталу белгісі
|
растырамыз. Бұл жердегі мәселе: бір немесе үш цифрды бейне- леу керек пе? Байт 0-ден 255-ке дейінгі мәндерді қабылдайды. Позициялық санау жүйесін қолдана отырып, сандарды белгілі бір санау жүйесінде жазу үшін санды негізіне бөлудің нәтижесін есептеп, қалдықтарын кері ретпен жазып отырады.
Мысалы:
Сан = 251.
10-ға бөлеміз. Бүтін бөлігі 25, "1" қалдық.
Тағы да 10-ға бөлеміз. Бүтін бөлігі 2, "5" қалдық. Тағы да 10-ға бөлеміз. Бүтін 0, "2" қалдық.
Экранға: "2", "5", "1" сандарын шығарамыз.
Есепті программаның стегін пайдалана отырып шығарамыз. Қалдықтарды PUSH операторын пайдалана отырып, стекке ор- наластырамыз. Мұнымен қатар стекке орналастырылған қал- дықтардың санын да есептеп отырамыз. CX регистрі санағыш. Кейін оны циклді ұйымдастыру үшін пайдаланамыз, ол жерде қалдықтарды стектен POP операторы арқылы шақырамыз. Стек- тің жұмысына тоқталатын болсақ, POP операторы PUSH опера- торымен енгізілген соңғы сөзді шығарады. Ескеретіні, PUSH операторы стекке сөзді (WORD) немесе қос сөзді (DWORD) ор- наластырады. POP операторы да осыған ұқсас жұмыс істейді.
Достарыңызбен бөлісу: |