Copy a string: Difference between revisions
Content added Content deleted
Puppydrum64 (talk | contribs) |
|||
Line 2,643: | Line 2,643: | ||
-> dp (0x4030a4) = Goodbye, World! |
-> dp (0x4030a4) = Goodbye, World! |
||
-> bytes copied: 15 |
-> 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> |
</pre> |
||