Среда: Debian 9.5 - gcc 6.3.0
Я не могу заставить работать встроенную функцию сборки, когда пытаюсь использовать несколько InputOperands
.
У меня работает следующий код (базовая rol
функция, 1 InputOperand
, предопределенный rol
операнд):
#include <stdio.h>
#include <stdlib.h>
void asm_rol(int32_t* p_rolled)
{
__asm__ volatile
(
".intel_syntax noprefix;"
"rol %0, 1;"
:"=a"(*p_rolled)
:"a"(*p_rolled)
:"cc"
);
}
int main(int argc, char** argv)
{
int32_t test = 0x1;
asm_rol(&test);
printf("0x%08x\n", test);
return 0;
}
Это печатает 0x00000002
, и является правильным результатом rol 0x1, 1
.
Теперь я не понимаю, почему следующий код не компилируется. Я думаю, что мое использование InputOperands
плохо:
#include <stdio.h>
#include <stdlib.h>
void asm_rol(int32_t* p_rolled, int16_t i)
{
__asm__ volatile
(
".intel_syntax noprefix;"
"rol %0, %1;"
:"=a"(*p_rolled)
:"a"(*p_rolled), "b"(i)
:"cc"
);
}
int main(int argc, char** argv)
{
int32_t test = 0x1;
asm_rol(&test, 1);
printf("0x%08x\n", test);
return 0;
}
gcc возвращает с ошибкой:
resolve.c: Assembler messages:
resolve.c:6: Error: operand type mismatch for `rol'
Я пробовал с int8_t
и int32_t
для i
, это ничего не меняет.
Должен сказать, что я новичок во внедрении asm в C в этой среде, я только выполнил некоторые базовые встроенные сборки с Visual Studio для Windows.