123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172 |
- .define ___Get_PC, ___Set_PC, ___u_LiB
- .sect .text; .sect .rom; .sect .data
- ! $Id$
- ! This is the machine-dependant part of the ACK debugger support.
- ! ___Get_PC takes a frame pointer (local base) argument and returns the
- ! return address from this frame.
- ! ___Set_PC takes a frame pointer (local base) argument plus a return
- ! address and sets the return address of this frame to the
- ! return address supplied.
- ! ___u_LiB saves the scratch registers and then calls ___uX_LiB;
- ! when ___uX_LiB returns, the scratch registers are restored.
- ! ___u_LiB is the solution chosen for the Intel 80386 back-end.
- ! Other back-ends could choose different solutions.
- ! The local base of ___uX_LiB is kind of special: because of ___u_LiB,
- ! the "interesting" return address of this particular stack-frame is found
- ! in a different place than the one of a normal stack-frame:
- ! the "interesting" return address is in fact the return address of
- ! ___u_LiB. Therefore, we save the local base of ___uX_LiB in sv_bp.
- .sect .data
- sv_bp:
- .data4 0
- .sect .text
- ___Get_PC:
- mov ebx,esp
- mov eax,4(ebx)
- or eax,eax
- je 1f
- cmp (sv_bp),eax
- je 2f
- mov eax,4(eax)
- 1:
- ret
- 2:
- mov eax,28(eax)
- ret
- ___Set_PC:
- mov ebx,esp
- mov eax,4(ebx)
- mov ebx,8(ebx)
- or eax,eax
- je 1f
- cmp (sv_bp),eax
- je 2f
- mov 4(eax),ebx
- 1:
- ret
- 2:
- mov 28(eax),ebx
- ret
- ___u_LiB:
- push eax
- push ebx
- push ecx
- push edx
- push (sv_bp)
- mov eax,esp
- sub eax,8
- mov (sv_bp),eax ! this is the LB of __uX_LiB
- call ___uX_LiB
- pop (sv_bp)
- pop edx
- pop ecx
- pop ebx
- pop eax
- ret
|