test: x86-64 Assembly NASM syntax test

This commit is contained in:
Filip Czaplicki 2020-10-07 17:30:48 +02:00 committed by David Peter
parent 8832a96e82
commit 5fe98689d4
2 changed files with 172 additions and 0 deletions

View File

@ -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

View File

@ -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