(Срочно)Исправить небольшой код на C++ с ассемблерной вставкой
Заказ в том, чтобы быстро исправить код, код компилировался в visual studio 2019 и выполнял задание. Код размещён на GitHub и ниже в описании задания.
Ссылка на код https://github.com/ProMix0/Laboratory/blob/master/...
Задание было:
Написать функцию Swap, которая меняет местами содержимое двух областей памяти
одинаковой длины.
void Swap(void *Mem1, void *Mem2, long Len)
Здесь Mem1 — указатель на первую область памяти, Mem2 — на вторую, Len — их длина в
байтах. Для параметра Len использован знаковый тип, поскольку работоспособность функции
должна гарантироваться при 0 ≤ Len < 2^31.
В коде реализовать цикл обмена областей памяти блоками по 4 или 8 байт. Обмен по 8 байт может быть реализован через стек математического
сопроцессора с помощью команд fild (загрузка числа из памяти в стек) и fistp (выгрузка числа из
стека в память) со спецификатором размера qword ptr (четверное слово). Стек сопроцессора
при необходимости может быть использован и при обмене блоками по 4 байта. В этом случае в
командах fild и fistp используется спецификатор размера dword ptr. Поскольку значение Len в
общем случае может быть не кратно 4 или 8, оставшиеся после цикла обмена двойных или
четверных слов байты обменять любым удобным способом.
Рассмотреть примеры работы функции. В каждом примере берутся два массива одного
типа и одной длины, но с разным содержанием (допустимо использовать как статические, так и
динамические массивы). Для них вызывается функция Swap. Массивы рассмотреть двух видов:
— вещественных чисел типа float;
— символов char (т.е. заполняется некоторой строкой).
При этом для каждого вида массивов рассмотреть два случая с разной длиной, т.е. функцию
Swap для каждого вида массивов запускать дважды. Всего получается 4 примера.
Вывести результаты на экран (два массива: до и после вызова функции Swap). X86
Код:
#include <stdio.h>
void Swap(void* mem1, void* mem2, int len) {
asm("mov rcx,rdx\n"
"shr rcx,3\n"
"and rdx,7\n"
"test rcx,rcx\n"
"jz skip_8\n"
"loop_8:"
"mov rax,[rsi]\n"
"mov rbx,[rdi]\n"
"mov [rdi],rax\n"
"mov [rsi],rbx\n"
"add rsi,8\n"
"add rdi,8\n"
"loop loop_8\n"
"skip_8:"
"mov rcx,rdx\n"
"test rcx,rcx\n"
"jz return\n"
"loop_1:"
"mov al,[rsi]\n"
"mov bl,[rdi]\n"
"mov [rdi],al\n"
"mov [rsi],bl\n"
"inc rsi\n"
"inc rdi\n"
"loop loop_1\n"
"return:");
}
void main() {
float a[] = {-1, 2.4, 3.0}, b[] = {4.25, -5.15, 6.666666};
for (int i = 0; i < 3; i++) printf("%f ", a[i]);
printf("\n");
for (int i = 0; i < 3; i++) printf("%f ", b[i]);
printf("\nSwap\n");
Swap(a, b, 3 * sizeof(float));
for (int i = 0; i < 3; i++) printf("%f ", a[i]);
printf("\n");
for (int i = 0; i < 3; i++) printf("%f ", b[i]);
printf("\n\n\n");
float c[] = {-1, 2.4, 3.0, 15.345, 09.90},
d[] = {123.456, 654.321, 4.25, -5.15, 6.666666};
for (int i = 0; i < 3; i++) printf("%f ", c[i]);
printf("\n");
for (int i = 0; i < 3; i++) printf("%f ", d[i]);
printf("\nSwap\n");
Swap(c, d, 5 * sizeof(float));
for (int i = 0; i < 3; i++) printf("%f ", c[i]);
printf("\n");
for (int i = 0; i < 3; i++) printf("%f ", d[i]);
printf("\n\n\n");
char e[] = "hello", f[] = "world";
printf("%s\n%s\nSwap\n", e, f);
Swap(e, f, 5);
printf("%s\n%s\n\n\n", e, f);
char g[] = "goodbye", h[] = "my hell";
printf("%s\n%s\nSwap\n", g, h);
Swap(g, h, 7);
printf("%s\n%s\n\n\n", g, h);
}