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
|
||
|
|