
Сообщение от
Oleg N. Cher
такую отследить ещё сложнее.
А я имел в виду Си. В PL/M нет рекурсии.
Вот вам код. Регистр <BC> содержит значение регистровой переменной. Я намеренно зарезервировал 3 байта под локальные данные чтоб было яснее.
Размер буфера под локальные переменные компилятор знает сразу же, на первом проходе, не даром C требует объявления всех локальных переменных в начале тела функции. При отсутствии локальных переменных, Manx тем не менее генерит
LXI D,0
call csave
ret
Разберитесь как это работает, и вам всё станет ясно, надеюсь.
Код:
foo() { char locals[3]; }
;Сгенерённый компилятором код
PUBLIC foo_
foo_: lxi d,.8
call csave
; char locals[3];
;}
RET
.8 EQU -3
Библиотечный код:
cret:
XCHG
POP H
SPHL
POP B
XCHG
MOV A,H
ORA L
RET
;
public csave,cret
csave:POP H
PUSH B
MOV B,H
MOV C,L
LXI H,0
DAD SP
XCHG
DAD SP
SPHL
PUSH D
lxi h,cret
push h
mov h,b
mov l,c
pchl
PS. Дико извиняюсь за hijack треда.