57 lines
1.3 KiB
Plaintext
57 lines
1.3 KiB
Plaintext
constant W = machine_word(),
|
|
{RTN,PREVEBP} = iff(W=4?{8,20}:{16,40})
|
|
|
|
procedure show_stack()
|
|
sequence symtab, symtabN
|
|
integer rtn
|
|
atom prev_ebp
|
|
|
|
#ilASM{
|
|
[32]
|
|
lea edi,[symtab]
|
|
call :%opGetST -- [edi]=symtab (ie our local:=the real symtab)
|
|
mov edi,[ebp+20] -- prev_ebp
|
|
mov eax,[edi+8] -- calling routine no
|
|
mov [rtn],eax
|
|
mov eax,edi
|
|
lea edi,[prev_ebp]
|
|
call :%pStoreMint
|
|
[64]
|
|
lea rdi,[symtab]
|
|
call :%opGetST -- [rdi]=symtab (ie our local:=the real symtab)
|
|
mov rdi,[rbp+40] -- prev_ebp
|
|
mov rax,[rdi+16] -- calling routine no
|
|
mov [rtn],rax
|
|
mov rax,rdi
|
|
lea rdi,[prev_ebp]
|
|
call :%pStoreMint
|
|
[]
|
|
}
|
|
while rtn!=21 do -- (T_maintls, main top level routine, always present)
|
|
symtabN = symtab[rtn]
|
|
?symtabN[1]
|
|
prev_ebp = peekNS(prev_ebp+PREVEBP,W,0)
|
|
rtn = peekNS(prev_ebp+RTN,W,0)
|
|
end while
|
|
end procedure
|
|
|
|
procedure three(bool die)
|
|
if die then
|
|
?9/0
|
|
else
|
|
show_stack()
|
|
end if
|
|
end procedure
|
|
|
|
procedure two(bool die)
|
|
three(die)
|
|
end procedure
|
|
|
|
procedure one(bool die)
|
|
two(die)
|
|
end procedure
|
|
|
|
one(0)
|
|
?routine_id("dummy") -- see note below
|
|
one(1)
|