#strcpy.c
1 messages · Page 1 of 1 (latest)
;asm c
#include <stdio.h>
static void strcpy2(char* dest, char* source)
{
while (*dest++ = *source++) { }
}
int main()
{
char* a = "abc";
char* x = "xyz\0\0\0\0";
strcpy2(x,a);
puts(x);
return 0;
}
Assembly Output
strcpy2:
push rbp
mov rbp, rsp
mov QWORD PTR [rbp-8], rdi
mov QWORD PTR [rbp-16], rsi
nop
.L2:
mov rdx, QWORD PTR [rbp-16]
lea rax, [rdx+1]
mov QWORD PTR [rbp-16], rax
mov rax, QWORD PTR [rbp-8]
lea rcx, [rax+1]
mov QWORD PTR [rbp-8], rcx
movzx edx, BYTE PTR [rdx]
mov BYTE PTR [rax], dl
movzx eax, BYTE PTR [rax]
test al, al
jne .L2
nop
nop
pop rbp
ret
.LC0:
.string "abc"
.LC1:
.string "xyz"
.string ""
.string ""
.string ""
.string ""
main:
push rbp
mov rbp, rsp
sub rsp, 16
mov QWORD PTR [rbp-8], OFFSET FLAT:.LC0
mov QWORD PTR [rbp-16], OFFSET FLAT:.LC1
mov rdx, QWORD PTR [rbp-8]
mov rax, QWORD PTR [rbp-16]
mov rsi, rdx
mov rdi, rax
call strcpy2
mov rax, QWORD PTR [rbp-16]
mov rdi, rax
call puts
mov eax, 0
leave
ret
fd26#0000 | 71ms | c | x86-64 gcc 13.2 | godbolt.org
;asm c
#include <stdio.h>
static void strcpy3(char* dest, char* source)
{
while (*source) { *dest = *source; ++dest; ++source; }
}
int main()
{
char* a = "abc";
char* x = "xyz\0\0\0\0";
strcpy3(x,a);
puts(x);
return 0;
}
Assembly Output
strcpy3:
push rbp
mov rbp, rsp
mov QWORD PTR [rbp-8], rdi
mov QWORD PTR [rbp-16], rsi
jmp .L2
.L3:
mov rax, QWORD PTR [rbp-16]
movzx edx, BYTE PTR [rax]
mov rax, QWORD PTR [rbp-8]
mov BYTE PTR [rax], dl
add QWORD PTR [rbp-8], 1
add QWORD PTR [rbp-16], 1
.L2:
mov rax, QWORD PTR [rbp-16]
movzx eax, BYTE PTR [rax]
test al, al
jne .L3
nop
nop
pop rbp
ret
.LC0:
.string "abc"
.LC1:
.string "xyz"
.string ""
.string ""
.string ""
.string ""
main:
push rbp
mov rbp, rsp
sub rsp, 16
mov QWORD PTR [rbp-8], OFFSET FLAT:.LC0
mov QWORD PTR [rbp-16], OFFSET FLAT:.LC1
mov rdx, QWORD PTR [rbp-8]
mov rax, QWORD PTR [rbp-16]
mov rsi, rdx
mov rdi, rax
call strcpy3
mov rax, QWORD PTR [rbp-16]
mov rdi, rax
call puts
mov eax, 0
leave
ret
fd26#0000 | 123ms | c | x86-64 gcc 13.2 | godbolt.org
;asm c -O3
#include <stdio.h>
static void strcpy2(char* dest, char* source)
{
while (*dest++ = *source++) { }
}
int main()
{
char* a = "abc";
char* x = "xyz\0\0\0\0";
strcpy2(x,a);
puts(x);
return 0;
}
Assembly Output
.LC0:
.string "abc"
.LC1:
.string "xyz"
.string ""
.string ""
.string ""
.string ""
main:
sub rsp, 8
xor eax, eax
.L2:
movzx edx, BYTE PTR .LC0[rax]
add rax, 1
mov BYTE PTR .LC1[rax-1], dl
test dl, dl
jne .L2
mov edi, OFFSET FLAT:.LC1
call puts
xor eax, eax
add rsp, 8
ret
fd26#0000 | 207ms | c | x86-64 gcc 13.2 | godbolt.org
;asm c -O3
#include <stdio.h>
static void strcpy3(char* dest, char* source)
{
while (*source) { *dest = *source; ++dest; ++source; }
}
int main()
{
char* a = "abc";
char* x = "xyz\0\0\0\0";
strcpy3(x,a);
puts(x);
return 0;
}
Assembly Output
.LC0:
.string "xyz"
.string ""
.string ""
.string ""
.string ""
.LC1:
.string "abc"
main:
sub rsp, 8
xor eax, eax
mov edx, 97
.L2:
mov BYTE PTR .LC0[rax], dl
movzx edx, BYTE PTR .LC1[rax+1]
add rax, 1
test dl, dl
jne .L2
mov edi, OFFSET FLAT:.LC0
call puts
xor eax, eax
add rsp, 8
ret
fd26#0000 | 121ms | c | x86-64 gcc 13.2 | godbolt.org
;compile C
#include <stdio.h>
static void strcpy3(char* dest, char* source)
{
while (*source) { *dest = *source; ++dest; ++source; }
}
int main()
{
char a[4] = "abc";
char x[16] = "xyz\0\0\0\0";
strcpy3(x,a);
puts(x);
return 0;
}
Program Output
abc
fd26#0000 | 57ms | c | x86-64 gcc 13.2 | godbolt.org
;asm C -O3
#include <stdio.h>
static void strcpy3(char* dest, char* source)
{
while (*source) { *dest = *source; ++dest; ++source; }
}
int main()
{
char a[4] = "abc";
char x[16] = "xyz\0\0\0\0";
strcpy3(x,a);
puts(x);
return 0;
}
Assembly Output
main:
sub rsp, 40
xor eax, eax
mov edx, 97
mov DWORD PTR [rsp+12], 6513249
mov QWORD PTR [rsp+16], 8026488
mov QWORD PTR [rsp+24], 0
.L2:
mov BYTE PTR [rsp+16+rax], dl
add rax, 1
movzx edx, BYTE PTR [rsp+12+rax]
test dl, dl
jne .L2
lea rdi, [rsp+16]
call puts
xor eax, eax
add rsp, 40
ret
fd26#0000 | 84ms | c | x86-64 gcc 13.2 | godbolt.org
;asm c -O3
#include <stdio.h>
static void strcpy2(char* dest, char* source)
{
while (*dest++ = *source++) { }
}
int main()
{
char a[4] = "abc";
char x[16] = "xyz\0\0\0\0";
strcpy2(x,a);
puts(x);
return 0;
}