mirror of
https://github.com/janishutz/eth-summaries.git
synced 2026-03-15 05:10:06 +01:00
[SPCA] Finish unorthodox control flow
This commit is contained in:
27
semester3/spca/code-examples/01_asm/09_setjmp-longjmp.s
Normal file
27
semester3/spca/code-examples/01_asm/09_setjmp-longjmp.s
Normal file
@@ -0,0 +1,27 @@
|
||||
# Copyright 2011-2012 Nicholas J. Kain, licensed under standard MIT license
|
||||
setjmp:
|
||||
mov %rbx, (%rdi)
|
||||
mov %rbp, 8(%rdi)
|
||||
mov %r12, 16(%rdi)
|
||||
mov %r13, 24(%rdi)
|
||||
mov %r14, 32(%rdi)
|
||||
mov %r15, 40(%rdi)
|
||||
lea 8(%rsp), %rdx
|
||||
mov %rdx, 48(%rdi)
|
||||
mov (%rsp), %rdx
|
||||
mov %rdx, 56(%rdi)
|
||||
xor %eax, %eax
|
||||
ret
|
||||
|
||||
longjmp:
|
||||
xor %eax, %eax
|
||||
cmp $1, %esi # CF = val ? 0 : 1
|
||||
adc %esi, %eax # eax = val + !val
|
||||
mov (%rdi), %rbx # rdi is the jmp_buf, restore regs from it
|
||||
mov 8(%rdi), %rbp
|
||||
mov 16(%rdi), %r12
|
||||
mov 24(%rdi), %r13
|
||||
mov 32(%rdi), %r14
|
||||
mov 40(%rdi), %r15
|
||||
mov 48(%rdi), %rsp
|
||||
jmp *56(%rdi) # goto saved address without altering rsp
|
||||
Reference in New Issue
Block a user