xiranda/test.asm

114 lines
3.5 KiB
NASM

linux_read_system_call = 0
linux_write_system_call = 1
linux_open_system_call = 2
linux_close_system_call = 3
linux_exit_system_call = 60
standard_input = 0
standard_output = 1
format ELF64 executable 3
segment readable executable
;~section '.text' writable
_start:
mov [echo_0], text_data ; text);
call echo ; echo (
loop_1:
cmp [main_x], 51
jnb loop_1e
xor rdx, rdx
mov eax, [main_x]
mov ebx, 15
idiv rbx
cmp edx, 0
jne n3
mov [echo_0], fb
call echo
jmp n0
n3:
xor rdx, rdx
mov eax, [main_x]
mov ebx, 3
idiv rbx
cmp edx, 0
jne n1
mov [echo_0], f
call echo
jmp n0
n1:
xor rdx, rdx
mov eax, [main_x]
mov ebx, 5
idiv rbx
cmp edx, 0
jne n2
mov [echo_0], b
call echo
jmp n0
n2:
mov [echo_0], n
call echo
n0:
inc [main_x]
jmp loop_1
loop_1e:
;
mov rax, linux_exit_system_call ; <main> return;;
xor rdi, rdi
syscall
;~string_length (character * text):
;~natural length = 0;
;~loop (* (text + length++));
;~return (length);;
string_length: ; string_length
mov [string_length_length], 0 ; length = 0;
mov rax, [string_length_0] ; text
loop_0: ; loop_0
cmp byte [rax], 0 ; (* (text + length)) != '\0'
je loop_0e
inc rax ; text + length
inc [string_length_length] ; length++
jmp loop_0 ; if not go loop_0
loop_0e:
xor rax, rax
mov eax, [string_length_length] ; return (length);
ret ; ;
;~echo (character * text):
;~system (linux_write_system_call, standard_output, text, string_length (text));
;~return;;
echo: ; echo )
mov rax, [echo_0] ; |
mov [string_length_0], rax ; |
call string_length ; |
mov rdx, rax ; | string_length (text)
mov rsi, [echo_0] ; text
mov rdi, standard_output ; standard_output
mov rax, linux_write_system_call ; linux_write_system_call
syscall ; system (
xor rax, rax ; return;;
ret ;
segment readable writable
;~section '.data' writable
; variable
string_length_length dd 0 ; natural length = 0;
main_x dd 1 ; integer x = 0;
; function
echo_0 dq 0 ; character * text
string_length_0 dq 0 ; character * text
; data
text_data db 'Heyo world!', 10, 0
fb db 'fizzbuzz', 10, 0
f db 'fizz', 10, 0
b db 'buzz', 10, 0
n db 'number', 10, 0