Nabiev Anush Ответов: 2

Как использовать "asm" в C++ ?


Привет, у меня есть некоторые проблемы, когда я использую "asm" в C++.
Мне нужно найти максимальное значение в массиве, я написал код, но он не сравнивается.

Что я уже пробовал:

void func1(int x[],int lenght){ // Find MAX 
    
    int max, z = x[0]; //Make first elem is MAX
    
    __asm__ volatile 
        (   
            "movl %1, %%eax;"
            "movl %%eax, %0;"
            : "=r" ( max )        
            : "r" ( z )         
            : "%eax" 
        );

    
    for(int i = 1 ; i < lenght; i++) //From second element to end
    {
        __asm__ volatile
        (   
            "movl %1, %%ebx;" // Move x[i] to EBX
            "cmpl %%ebx,%%eax;" 
            "jl DONE;"// If EAX less EBX JUMP to 'DONE'
            "DONE: movl %%ebx,%%eax;" // MOVE EBX to EAX
            "movl %%eax , %0" // MOVE EAX to 'max'
            :"=r"(max)
            :"r"(x[i])
        );
    }

    cout << "MAX" << endl;
    cout << max << endl;
}

Rick York

Вот как пишется длина.

Я не знаю языка ассемблера, потому что никогда не считал его необходимым. Однако однажды я написал генератор машинного кода "на лету". Я сделал это, выяснив, какой машинный код испускается при написании фрагментов кода на языке Си, а затем изучив ассемблер компилятора и списки машинного кода. Я рекомендую сделать это для этого кода. Это довольно просто, поэтому напишите его на языке Си, а затем посмотрите, что компилятор делает с кодом в своих списках ассемблера. В любом случае, именно так я и поступлю.

Nabiev Anush

Спасибо за совет !

Stefan_Lang

Это на самом деле очень хороший совет: может быть, он даст людям представление о том, насколько бессмысленно в наши дни предоставлять ассемблерный код самостоятельно ;-)

2 Ответов

Рейтинг:
9

Nabiev Anush

Я использую другой способ, как найти максимальное значение в массиве.
Я использовал MS Visual Studio.

include 

define LEN 6

using namespace std;

int task1();

int main() {
    cout << "Task 1: " << task1() << endl;
    return 0;
}

int task1() {
    int mas[LEN] = { 1, 2, 7, 4, 5, 6 };

    __asm {
        xor eax, eax
        mov ecx, LEN

        cycle_mark :
            mov edx, [mas + 4 * ecx]
            cmp eax, edx
                jl max_mark
                jg check_mark

        max_mark :
            mov eax, edx

        check_mark :
            dec ecx
            cmp ecx, 0
                jne cycle_mark
    }
}


Рейтинг:
1

steveb

Полностью зависит от компилятора. Ваше дело похоже на ССАГПЗ. В MSVC это будет больше похоже на:

__asm {
   mov al, 2
   mov dx, 0xD007
   out dx, al
};