2016-02-28 5 views
0

Является ли «законным» иметь инструкцию gm inline asm без фактической инструкции?gcc inline asm без инструкции

Например, заявление asm "legal"? Будет ли оно вводить неопределенное поведение?

int main(){ 
    int *p = something; 
    asm("":"=m"(p)); 
    return 0; 
} 
+0

Поскольку вы предоставили выход, но результат не используется, компилятор (предполагающий совместимость с gcc) может свободно исключать выражение asm. –

+0

Это нормально, но чего вы надеетесь достичь? Один общий пустой asm - asm ("": "+ m" (f)) для принудительного округления поплавка f на x87. –

+0

Да, это все еще хорошо. Как я сказал ниже, использование расширенного asm может (возможно) ввести незначительную неэффективность, но это не приведет к неправильному коду. Если вам действительно неудобно оставлять этот пробел, вы всегда можете добавить комментарий ('' # no code here today! "'). –

ответ

2
int main(){ 
int *p = 0; 
asm("":"=m"(p)); 
return 0; 
} 

компилировать без каких-либо ошибок, но это не является необходимым:

main: 
.LFB0: 
.cfi_startproc 
pushq %rbp 
.cfi_def_cfa_offset 16 
.cfi_offset 6, -16 
movq %rsp, %rbp 
.cfi_def_cfa_register 6 
movq $0, -8(%rbp) 
movl $0, %eax 
popq %rbp 
.cfi_def_cfa 7, 8 
ret 

GCC полностью игнорирует, что пустой asm заявление.

0

В этом конкретном примере компилятор может видеть, что ни один из выходов asm (т.е. p) не используется. Поскольку asm не является изменчивым (и имеет как минимум 1 вывод), компилятор может полностью отказаться от оператора во время оптимизации.

Возможно, стоит упомянуть, что на i386 все расширенные операторы asm (т.е. с параметрами) всегда неявно clobber fpsr (флаги с плавающей запятой) и eflags (думаю: cc clobber). Если оператор не полностью отбрасывается (например, если он нестабилен), это может привести к ошибке . Если это так, то в худшем случае будет крошечный потери эффективности, а не неправильных результатов.

Так, чтобы подвести итог:

  • Да, это законно.
  • Нет, он не вводит неопределенное поведение. ЗА ИСКЛЮЧЕНИЕМ, что значение p может быть неопределенным, так как вы говорите, что переписываете содержимое, но вы на самом деле ничего не вкладываете в него.
  • Это может теоретически ввести крошечную неэффективность, но, вероятно, этого не произойдет.
Смежные вопросы