76
12.5. Овърлейни процедури
При свързването на подпрограми на асемблер към овърлейни процедури трябва
да се внимава да не се свързват подпрограми, които записват стойности, трябващи им
при повторно извикване. Подпрограмата може да бъде изхвърлена и по-късно заредена
отново в паметта, тогава съхранените стойности ще бъдат загубени, т.е. те ще бъдат в
началното си състояние, записано от асемблера. Например, нека сме написали
подпрограма на асемблер, която попълва някакъв буфер, за да го отпечата на
екрана/принтера или за да го запише във файл. Тя изпраща съдържанието на буфера
по реалното му предназначение, едва след като той се напълни или ако бъде
предизвикано явно записване на буфера.
; procedure SendChar(ch: char);
SendChar ent
; подпрограмите на асемблер, които ще бъдат 
dw
0
; свързвани с UniPascal, започват с 0.
ins
ins
; изхвърляне адреса за връщане в интерпретатора
pula
; изваждане стойността на параметъра
ins
; и игнориране на старшия му байт
ldx
buff_ptr
; записване на символа в буфера
staa
x, 0
inx
stx buff_ptr
cmpa #13
; символа  ли е?
beq
SendIt
; ако да, форсиране изпращането на буфера
cpx
#buff_end ; пълен ли е буфера?
beq
SendIt
; да, записване / изпращане / обработка
jmp
$befe
; връщане в интерпретатора на Y код (UniPascal)
; procedure SendBuff;
SendBuff ent
; тук започва подпрограмата за 
dw
0
; изпращане на буфера
ins
ins
SendIt
ldx
#buffer
; буфера може да е празен
bra
test_x
; затова първо проверяваме дали не е такъв
loop
; ... записване / изпращане / обработване на един символ
inx
test_x cpx
buff_ptr
; края на буфера?
bne
loop
; цикъл докато свършим
ldx
#buffer
; задаваме празен буфер
stx buff_ptr ; (започване от начало)
jmp
$befe
; връщане в интерпретатора на Y код (UniPascal)
buffer ds
1024
; 1 килобайт буфер
buff_end
Забележка: В синтаксиса на UniCross не съществува директива ENT (тя е
директива за UniASM), в неговия синтаксис тази директива се заменя от директивата
public, написана на отделен ред.
<<  <  GO  >  >>

Вернуться к началу сайта