Код с 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_:
}

Но я в ассемблере в общем-то чайник, так что работать будет, но от оптимальности этот код очень далек :)

→ Ссылка