#strcpy.c

1 messages · Page 1 of 1 (latest)

hushed frigate
#

strcpy(dest, src) equivalent C code

#

;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;
}
humble harnessBOT
#
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

hushed frigate
#

;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;
}
humble harnessBOT
#
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

hushed frigate
#

;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;
}
humble harnessBOT
#
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

hushed frigate
#

;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;
}
humble harnessBOT
#
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

hushed frigate
#

;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;
}
humble harnessBOT
#
Program Output
abc
hushed frigate
#

;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;
}
humble harnessBOT
#
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

hushed frigate
#

;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;
}