1#include <stdio.h>
 2#include <stdlib.h>
 3
 4extern int strlen2(char* str);
 5extern void memscp2(char* dest, char* src,unsigned int size);
 6extern void memscp3(char* dest, char* src,unsigned int size);
 7
 8int main()
 9{
10    int a = add(1, 2);
11    printf("%d\n", a);
12    printf("%d\n", strlen2("awd434"));
13
14    char* s = calloc(sizeof(char), 10);
15    memscp2(s, "awdawdawdfawffawf", strlen2("awdawdawdfawffawf"));
16    printf("%s\n", s);
17
18    char* ss = calloc(sizeof(char), 10);
19    memscp3(ss, "awdawdawdfawffawf", strlen2("awdawdawdfawffawf"));
20    printf("%s\n", s);
21
22    return 0;
23}
 1SECTION .data
 2
 3SECTION .text
 4    global memscp2
 5    global memscp3
 6
 7; void memscp2(char* dest /* rdi */ , char* src /* rsi */,unsigned int size /* rdx */)
 8memscp2:
 9    mov rcx, rdx
10    cld
11    rep movsb
12    ret
13
14; void memscp3(char* dest /* rdi */ , char* src /* rsi */,unsigned int size /* rdx */)
15memscp3:
16    mov rcx, rdx
17nextbyte:
18    mov rax, [rsi]
19    mov [rdi], rax
20    add rsi, 8
21    add rdi, 8
22    loop nextbyte
23    xor rax, rax
24    ret

写了两个版本,上面的是movsb,一个专门用来拷贝字符的指令,估计是有特殊优化。

下面是自己实现的。慢慢通过寄存器移动…