lang-bootstrap/04/in04

131 lines
1.6 KiB
Text
Raw Permalink Normal View History

2022-01-06 17:54:03 -05:00
main()
2022-01-06 17:37:02 -05:00
function main
2022-01-06 17:54:03 -05:00
puts(.str_hello_world)
putc(10) ; newline
syscall(0x3c, 0)
2022-01-06 17:54:03 -05:00
:str_hello_world
string Hello, world!
byte 0
2022-01-06 17:37:02 -05:00
function strlen
2022-01-06 17:54:03 -05:00
argument s
local c
local p
p = s
2022-01-06 17:54:03 -05:00
:strlen_loop
2022-01-08 10:15:43 -05:00
if *1p == 0 goto strlen_loop_end
p += 1
2022-01-06 17:54:03 -05:00
goto strlen_loop
:strlen_loop_end
return p - s
2022-01-06 17:37:02 -05:00
function putc
2022-01-06 17:54:03 -05:00
argument c
2022-01-08 10:15:43 -05:00
syscall(1, 1, &c, 1)
2022-01-06 17:54:03 -05:00
return
2022-01-06 13:53:52 -05:00
function puts
2022-01-06 17:54:03 -05:00
argument s
local len
len = strlen(s)
syscall(1, 1, s, len)
return
2022-01-06 14:02:30 -05:00
function syscall
2022-01-06 13:53:52 -05:00
; I've done some testing, and this should be okay even if
; rbp-56 goes beyond the end of the stack.
; mov rax, [rbp-16]
byte 0x48
byte 0x8b
byte 0x85
byte 0xf0
byte 0xff
byte 0xff
byte 0xff
; mov rdi, rax
byte 0x48
byte 0x89
byte 0xc7
; mov rax, [rbp-24]
byte 0x48
byte 0x8b
byte 0x85
byte 0xe8
byte 0xff
byte 0xff
byte 0xff
; mov rsi, rax
byte 0x48
byte 0x89
byte 0xc6
; mov rax, [rbp-32]
byte 0x48
byte 0x8b
byte 0x85
byte 0xe0
byte 0xff
byte 0xff
byte 0xff
; mov rdx, rax
byte 0x48
byte 0x89
byte 0xc2
; mov rax, [rbp-40]
byte 0x48
byte 0x8b
byte 0x85
byte 0xd8
byte 0xff
byte 0xff
byte 0xff
; mov r10, rax
byte 0x49
byte 0x89
byte 0xc2
; mov rax, [rbp-48]
byte 0x48
byte 0x8b
byte 0x85
byte 0xd0
byte 0xff
byte 0xff
byte 0xff
; mov r8, rax
byte 0x49
byte 0x89
byte 0xc0
; mov rax, [rbp-56]
byte 0x48
byte 0x8b
byte 0x85
byte 0xc8
byte 0xff
byte 0xff
byte 0xff
; mov r9, rax
byte 0x49
byte 0x89
byte 0xc1
; mov rax, [rbp-8]
byte 0x48
byte 0x8b
byte 0x85
byte 0xf8
byte 0xff
byte 0xff
byte 0xff
; syscall
byte 0x0f
byte 0x05
return