Я новичок в ассемблере.Я написал две реализации strcpy, используя masm;один использует rsi и rdi , а другой нет.Последний стоит меньше времени.Кажется, что рекомендуется использовать rsi и rdi для копирования данных, а последний имеет большую часть зацикливания, чем предыдущая.Но когда я измерил производительность, первый стоил больше времени.Почему первый стоит больше времени, и каков рекомендуемый способ (рекомендуемые инструкции или регистры) для обработки строк в сборке x86-64?
strcpy с использованием rsi и rdi :
custom_strcpy proc
mov rsi, rdx
mov rdi, rcx
mov rax, rdi
_loop:
movsb
mov r8d, [rsi]
cmp r8d, 0
jne _loop
_end:
mov byte ptr[rdi], 0
ret
custom_strcpy endp
strcpy не использует rsi и rdi :
custom_strcpy proc
mov rax, rcx
_loop:
mov r8b, byte ptr[rdx]
mov byte ptr[rcx], r8b
inc rcx
inc rdx
cmp r8b, 0
jne _loop
ret
custom_strcpy endp
C ++ код, который я использовал для измерения производительности:
#include <iostream>
#include <chrono>
#include <cstring>
#define TIMES 100000000
using namespace std;
using namespace std::chrono;
extern "C" char * custom_strcpy(char * dst, const char * src);
extern "C" void foo()
{
char src[] = "Hello, world!";
char dst[sizeof(src)];
auto start = high_resolution_clock::now();
for (int i = 0; i < TIMES; i++)
{
strcpy(dst, src);
}
auto end = high_resolution_clock::now();
cout << duration_cast<duration<double>>(end - start).count() << endl;
start = high_resolution_clock::now();
for (int i = 0; i < TIMES; i++)
{
custom_strcpy(dst, src);
}
end = high_resolution_clock::now();
cout << duration_cast<duration<double>>(end - start).count() << endl;
}