Copy a string: Difference between revisions

Line 2,643:
-> dp (0x4030a4) = Goodbye, World!
-> bytes copied: 15
</pre>
 
===NASM 2.15===
<lang asm>
%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
</lang>
{{out}}
<pre>
Goodbye, World!
</pre>