diff options
Diffstat (limited to 'tests/syntax-tests/source/Assembly (x86_64)/test.nasm')
-rw-r--r-- | tests/syntax-tests/source/Assembly (x86_64)/test.nasm | 86 |
1 files changed, 86 insertions, 0 deletions
diff --git a/tests/syntax-tests/source/Assembly (x86_64)/test.nasm b/tests/syntax-tests/source/Assembly (x86_64)/test.nasm new file mode 100644 index 00000000..05c87947 --- /dev/null +++ b/tests/syntax-tests/source/Assembly (x86_64)/test.nasm @@ -0,0 +1,86 @@ +global enlight + +section .data + red dq 0 ; some comment + green dq 0 + blue dq 0 + data dq 0 + N dd 0 + M dd 0 + change dd 0 + delta db 0 + +section .text +enlight: + call assign_arguments + call set_data + call make_deltas + ret + +assign_arguments: + mov qword[red], rdi + mov qword[green], rsi + mov qword[blue], rdx + mov dword[N], ecx + mov dword[M], r8d + mov dword[change], r9d + mov al, byte[rsp + 16] + mov byte[delta], al + ret + +set_data: + mov eax, dword[change] + cmp eax, 1 + jne not_1 + mov rax, qword[red] + mov qword[data], rax + ret +not_1: + cmp eax, 2 + jne not_2 + mov rax, qword[green] + mov qword[data], rax + ret +not_2: + mov rax, qword[blue] + mov qword[data], rax + ret + + +make_deltas: + mov ecx, dword[N] + mov eax, dword[M] + imul ecx, eax +loop_start: + call make_delta + loop loop_start + ret + +make_delta: + mov rax, qword[data] + add rax, rcx + dec rax + mov dl, byte[delta] + cmp dl, 0 + jl substracting +adding: + add dl, byte[rax] + jc adding_overflow + mov byte[rax], dl + ret +adding_overflow: + mov byte[rax], 255 + ret +substracting: + mov r9b, dl + mov dl, 0 + sub dl, r9b + mov r8b, byte[rax] + sub r8b, dl + jc substracting_overflow + mov byte[rax], r8b + ret +; another comment +substracting_overflow: + mov byte[rax], 0 + ret |