Итак, я научил себя x86 Assembly a while back и просто играл с inline Assembly на C++.Изменение значений массива в функции - Встроенная сборка
Итак, что я хочу сделать, это параметры функций, передать в массив, индекс (unsigned int) и число. С помощью сборки он затем изменит значение в этой ячейке памяти массива на переданное значение. Таким образом, код выглядит так.
inline void Set(int pArray[], unsigned int pIndex, int pNum) {
__asm {
mov ebx, pIndex
mov eax, 4
mul ebx
mov ebx, pNum
lea edi, pArray
mov [ edi + eax ], ebx
}
}
int main() {
int myArray[ 5 ] = { 1, 2, 3, 4, 5 };
Set(myArray, 2, 7);
std::cout << myArray[ 2 ] << std::endl;
}
Таким образом, код должен загрузить начало адреса массива, получить индекс и умножить на 4, так что ячейка памяти перемещается с тем, что многие байт, и это изменяет его значение, переданное в. Однако, когда я это делаю, значение остается неизменным. Почему это? Что происходит не так?
Возможно, вам захочется «mov edi, pArray», иначе вы можете загрузить адрес переменной аргумента, а не там, где он указывает. Возможно, вам захочется научить себя использовать отладчик тоже :) – Jester
Yup. Это была проблема. Я написал это из функции, изначально, где массив мог быть доступен в его области, поэтому он работал тогда, но когда он был инкапсулирован в функцию, он переставал работать, поэтому имеет смысл понять, почему я должен использовать «mov», а не «Леа». Спасибо :-) – CMilby