make a program
This commit is contained in:
parent
3a3bd78ff4
commit
46d84e91eb
70
exit_123.s
Normal file
70
exit_123.s
Normal file
|
@ -0,0 +1,70 @@
|
|||
|
||||
# || -> cont
|
||||
.func main
|
||||
# push a new integer
|
||||
pushq $100
|
||||
pushq $INT_code
|
||||
mov %rsp, %r11 # backup first arg
|
||||
|
||||
# push another new integer
|
||||
pushq $23
|
||||
pushq $INT_code
|
||||
mov %rsp, %r12 # backup second arg
|
||||
|
||||
# push the plus
|
||||
push %r12
|
||||
push %r11
|
||||
pushq $2
|
||||
pushq $plus
|
||||
mov %rsp, %r13 # backup plus
|
||||
|
||||
# push a cont thunk for main_exit
|
||||
push %rsi
|
||||
pushq $1
|
||||
pushq $main_exit
|
||||
|
||||
# evaluate into main_exit
|
||||
mov %rsp, %rsi
|
||||
enter %r13
|
||||
|
||||
# exitcode -> | cont (unused, should be 0) |
|
||||
.func main_exit
|
||||
mov 0x8(%rsi), %rdi # result to syscall exitcode
|
||||
mov $0x3c, %rax # syscall 60
|
||||
syscall # exit %rdi
|
||||
|
||||
# | arg1 | arg2 | -> cont
|
||||
.func plus
|
||||
# push a thunk for finishing the plus
|
||||
push %rsi # cont
|
||||
push %rbp # ret (self)
|
||||
mov 0x18(%rbp), %rax
|
||||
push %rax # arg2
|
||||
pushq $3
|
||||
pushq $plus_step1
|
||||
|
||||
mov %rsp, %rsi # continue to the new thunk
|
||||
enter 0x10(%rbp) # evaluate arg1
|
||||
|
||||
# arg1 -> | arg2 | ret | cont |
|
||||
.func plus_step1
|
||||
# this is guaranteed to be entered only once (it's a cont), so we can rewrite the thunk in place
|
||||
mov 0x10(%rbp), %rax
|
||||
movq $plus_fini, 0x00(%rbp)
|
||||
mov %rsi, 0x10(%rbp)
|
||||
|
||||
mov %rbp, %rsi # continue on the rewritten thunk
|
||||
enter %rax # evaluate arg1
|
||||
|
||||
# arg2 -> | arg1 | ret | cont |
|
||||
.func plus_fini
|
||||
mov 0x8(%rsi), %rax # arg 2
|
||||
mov 0x10(%rbp), %rsi # location of arg1
|
||||
add 0x8(%rsi), %rax # arg 1
|
||||
|
||||
mov 0x18(%rbp), %rsi # save result to the original plus thunk
|
||||
mov %rax, 0x08(%rsi)
|
||||
movq $INT_code, 0x00(%rsi)
|
||||
|
||||
enter 0x20(%rbp) # eval cont, returning %rsi
|
||||
|
Loading…
Reference in a new issue