114 lines
2 KiB
Text
114 lines
2 KiB
Text
%macro sysdef 2
|
|
%define sys_%1 %2
|
|
%endmacro
|
|
sysdef write, 1
|
|
|
|
%macro prolog 1
|
|
push rbp
|
|
mov rbp, rsp
|
|
sub rsp, %1
|
|
%endmacro
|
|
|
|
%macro epilog 1
|
|
add rsp, %1
|
|
pop rbp
|
|
%endmacro
|
|
|
|
%macro xlea 2
|
|
lea %1, [rel %2]
|
|
%endmacro
|
|
|
|
%macro inv 1-7 0,0,0,0,0,0
|
|
mov r9,%7
|
|
mov r8,%6
|
|
mov r10,%5
|
|
mov rdx,%4
|
|
mov rsi,%3
|
|
mov rdi,%2
|
|
mov rax,sys_%1
|
|
syscall
|
|
%endmacro
|
|
|
|
section .rodata
|
|
sz1 db "Goodbye, World!",0xa,0
|
|
|
|
section .bss
|
|
sz2 resq 1
|
|
|
|
section .text
|
|
strlcpy:
|
|
prolog 0x38
|
|
%define dest rbp-0x18
|
|
%define src rbp-0x10
|
|
%define n rbp-0x8
|
|
|
|
mov qword [rbp-0x28], rdi
|
|
mov qword [rbp-0x30], rsi
|
|
mov qword [rbp-0x38], rdx
|
|
mov rax, qword [rbp-0x28]
|
|
mov qword [dest], rax
|
|
mov rax, qword [rbp-0x30]
|
|
mov qword [src], rax
|
|
mov rax, qword [rbp-0x38]
|
|
mov qword [n], rax
|
|
cmp qword [n], 0
|
|
je _stlc_done
|
|
_stlc_doloop:
|
|
dec qword [n]
|
|
cmp qword [n], 0
|
|
je _stlc_done
|
|
mov rbx, qword [src]
|
|
lea rax, [rbx+1]
|
|
mov qword [src], rax
|
|
mov rax, qword [dest]
|
|
lea rcx, [rax+1]
|
|
mov qword [dest], rcx
|
|
movzx ebx, byte [rbx]
|
|
mov byte [rax], bl
|
|
movzx eax, byte [rax]
|
|
test al, al
|
|
je _stlc_done
|
|
jmp _stlc_doloop
|
|
_stlc_done:
|
|
epilog 0x38
|
|
ret
|
|
|
|
strlen:
|
|
prolog 0x10
|
|
%define s rbp-0x8
|
|
|
|
mov qword [rbp-0x10], rdi
|
|
mov rax, qword [rbp-0x10]
|
|
mov qword [s], rax
|
|
mov rsi, qword [s]
|
|
xor rcx, rcx
|
|
_stl_count:
|
|
cmp byte [rsi+rcx], 0
|
|
je _stl_exit
|
|
inc rcx
|
|
jne _stl_count
|
|
_stl_exit:
|
|
mov rax, rcx
|
|
epilog 0x10
|
|
ret
|
|
|
|
global main
|
|
main:
|
|
prolog 0x20
|
|
%define tmp rbp-0x20
|
|
xlea rbx, sz1
|
|
mov qword [tmp], rbx
|
|
mov rdi, qword [tmp]
|
|
call strlen
|
|
mov rcx, rax
|
|
push rcx
|
|
mov rdx, rcx
|
|
xlea rsi, sz1
|
|
xlea rdi, sz2
|
|
call strlcpy
|
|
xlea rbx, sz2
|
|
pop rcx
|
|
inv write, 1, rbx, rcx
|
|
inv exit, 0
|
|
epilog 0x20
|
|
ret
|