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