32 lines
		
	
	
		
			650 B
		
	
	
	
		
			ArmAsm
		
	
	
	
			
		
		
	
	
			32 lines
		
	
	
		
			650 B
		
	
	
	
		
			ArmAsm
		
	
	
	
| /
 | |
| / our buffer looks like:
 | |
| /  eax,ebx,ecx,edx,esi,edi,esp,ebp,pc
 | |
| /
 | |
| / _longjmp is called with two parameters:  jmp_buf*,int
 | |
| / jmp_buf* is at 4(%esp), int is at 8(%esp)
 | |
| / retaddr is, of course, at (%esp)
 | |
| 
 | |
| 	.globl	_longjmp
 | |
| 	.globl	longjmp
 | |
| _longjmp:
 | |
| longjmp:
 | |
| 	movl	4(%esp), %ebx	/ address of buf
 | |
| 	movl	8(%esp), %eax	/ store return value
 | |
| 
 | |
| 	movl	24(%ebx), %esp	/ restore stack
 | |
| 	movl	32(%ebx), %edi
 | |
| / Next line sets up return address.
 | |
| 	movl	%edi, 0(%esp)	
 | |
| 	movl	8(%ebx), %ecx
 | |
| 	movl	12(%ebx), %edx
 | |
| 	movl	16(%ebx), %esi
 | |
| 	movl	20(%ebx), %edi
 | |
| 	movl	28(%ebx), %ebp
 | |
| 	movl	4(%ebx), %ebx
 | |
| 	testl	%eax,%eax
 | |
| 	jne	bye
 | |
| 	incl	%eax		/ eax hold 0 if we are here
 | |
| bye:
 | |
| 	ret
 | |
| 
 |