Код с assembler овскими вставками
помоги реализовать аналогичный цикл из 1-го пункта, только на assembler
void language(vector<int> arr) {
int n;
cout << "Ввыбор метода исполнение задания" << endl;
cout << "1. На с++" << endl;
cout << "2. Со вставками assembler" << endl;
cin >> n;
cout << "Елементы удовлетворяющие условиям" << endl;
if (n == 1) {
for (int i = 0; i < arr.size(); ++i)
{
if (arr[i] == 5)
{
cout << arr[i];
break;
}
if (arr[i] % 2 == 1 && arr[i] > 0)
{
cout << arr[i] << " ";
}
}
}
if (n == 2) {
__asm
{
//тут код
}
}
}
Ответы (1 шт):
Автор решения: Harry
→ Ссылка
Ну, для VC++ я бы добавил отдельную функцию вывода типа
void outint(int x)
{
cout << x << " ";
}
а сам код — без малейших оптимизаций! — был бы примерно
int * a = arr.data();
unsigned int s = arr.size();
__asm {
mov ecx, s
cycle:
mov ebx, s
sub ebx, ecx
mov edi, a
mov eax, [edi+ebx*4]
cmp eax, 0
jle next_
and eax, 1
cmp eax, 0
je next_
mov eax, [edi+ebx*4]
push edi
push edx
push ecx
push ebx
push eax
call outint
pop eax
pop ebx
pop ecx
pop edx
pop edi
mov eax, [edi+ebx*4]
cmp eax, 5
je quit_
next_:
loop cycle
quit_:
}
Но я в ассемблере в общем-то чайник, так что работать будет, но от оптимальности этот код очень далек :)