72 lines
		
	
	
	
		
			1.5 KiB
		
	
	
	
		
			ArmAsm
		
	
	
	
	
	
			
		
		
	
	
			72 lines
		
	
	
	
		
			1.5 KiB
		
	
	
	
		
			ArmAsm
		
	
	
	
	
	
.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
 |