Флаг -masm = intel не работает для запуска ассемблера в компиляторе gcc с синтаксисом Intel - PullRequest
0 голосов
/ 15 января 2019

Я пытаюсь использовать встроенный ассемблер __asm ​​в моей программе на C с синтаксисом Intel, а не с синтаксисом AT & T. Я собираю с gcc -S -masm=intel test.c но это дает ошибку. Ниже мой файл test.c.

#include <stdio.h>
//using namespace std;
int AsmCode(int num,int power) {
    __asm {
        mov eax, num;
        mov ecx, power;
        shl eax, cl;
    };
}
int main()
{
    printf("eax value is %d\n",AsmCode(2,3));

    //getchar();
    return 0;



}

Ожидаемый результат: значение eax равно 16, но возникают ошибки, такие как имя неизвестного типа 'mov', имя неизвестного типа 'shl' и т. Д.

Edit: Я обновил код как:

int AsmCode(int num,int power) {
    __asm__ (
        "movl eax, num;"
        "mov ecx, power;"
        "shl eax, cl;"
    );
}
int main()
{
    printf("eax value is %d\n",AsmCode(2,3));
    return 0;
}

И скомпилировал этот код с gcc -S -masm=intel test.c. Это привело к NO OUTPUT , тогда как он должен выдавать результат как eax value is 16.

При компиляции с gcc test.c выдает ошибки:

Error: too many memory references for 'mov'
Error: too many memory references for 'shl'

Пожалуйста, помогите ..

1 Ответ

0 голосов
/ 15 января 2019

Самая важная ошибка - первая:

main.cpp:4:11: error: expected '(' before '{' token
     __asm {
           ^
           (

Вы используете неверный синтаксис для GCC.Вы использовали синтаксис Microsoft Visual Studio.Итак, ваш GCC не знает, что вы пытаетесь дать ему инструкции по сборке.

Вместо __asm { ... }, оно должно быть __asm__ ( "..." ).

Вот так:

int AsmCode(int num,int power) {
    __asm__ (
        "mov eax, num;"
        "mov ecx, power;"
        "shl eax, cl;"
    );
}

Подробнее здесь .

Обратите внимание, что существуют дополнительные проблемы с вашим ASM, о которых вы должны спросить отдельно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...