Ошибка чтения из массива в функцию C ++ (с использованием ASM)

У меня есть проблема. Я посылаю указатель на функцию, которая заменяет 3 последних элемента массива на 3 первых. Я должен использовать массив unsigned char для отправки, и он должен работать с ASM.

    int main(int argc, char* argv[])
{
unsigned char arr[24]={
1,2,3,4,5,6,
7,8,9,10,11,12,
13,14,15,16,17,18,
19,20,21,22,23,24
};// example

AsmFlipVertical(arr);
};
void AsmFlipVertical(unsigned char  *arr)
{
_asm
{
les esi,arr ; esi=adress of first elem
mov eax,esi
add eax,21
mov edi,eax ; edi=adress of first elem+21;edi is a adress of 21th elem of array
cld
mov ecx,3
rep movsb
}
}

MOVSB ​​из ESI в EDI
Я получил ошибку в «rep movsb» Что не так? Если использовать этот код ASM в основной функции, это нормально, но я должен использовать код ASM в функции …

0

Решение

Вы не должны использовать какие-либо инструкции, которые влияют на регистры сегмента в flat модели памяти. Итак, замени les esi,arr с mov esi,arr

0

Другие решения

les esi, arr инструкция неверна (вы не хотите менять также и регистр es) вам просто нужно использовать mov esi, arr
(проверено — работает)

0