Проблема со вставками ассемблера в коде C++
У меня есть задание: нужно написать код, который выполняет выражение 2x[i]-y[i]+1 и результат записывается в массив z. Программу нужно написать на C++ с ассемблерными вставками, причем на C++ реализовать просто инициализацию, заполнение и вывод массивов, а на ассемблере уже вычисления. Но я столкнулся с проблемой, что на ассемблере результат моих вычислений не записывается результат. Подскажите пожалуйста, в чем дело?
#include <iostream>
using namespace std;
int main() {
int x[4];
int y[4];
int z[4];
cout << "Enter X elements: ";
cin >> x[0] >> x[1] >> x[2] >> x[3];
cout << "Enter Y elements: ";
cin >> y[0] >> y[1] >> y[2] >> y[3];
__asm{
mov cx, 3
mov esi, 0
L1:
mov ebx, x[esi]
add ebx, x[esi]
sub ebx, y[esi]
inc ebx
mov z[esi], ebx
inc esi
loop L1
}
cout << z[0] << z[1] << z[2] << z[3] << endl;
return 0;
}
Ответы (1 шт):
Ошибки в вашем коде - надо использовать не cx, а ecx, и давать ему значение не 3, а 4. И в индексах использовать не [esi], а [esi*4] - это индексы в С++ знают о размерах элементов массива :), а у вас - ассемблер...
Словом, я бы вычислял так (VC++):
__asm {
mov ecx,4
Cycle:
mov eax, DWORD PTR x[ecx*4-4]
shl eax, 1
sub eax, DWORD PTR y[ecx*4-4]
inc eax
mov DWORD PTR z[ecx*4-4],eax
loop Cycle
}