2013-04-19 3 views
2

Как запросить gcc сбросить встроенное входное значение asm? %0 в следующем примере не сбрасывается до 42 после первого цикла. Поэтому, когда i = 1, %0 значение по-прежнему 0.Сброс встроенного входа gcc asm

for (int i = 0; i < N; ++i) 
    asm("label: substract_immediate_value %0,%0,1;" 
     "compare_immediate_value %0,0;" 
     "branch_not_equal label" 
     : /* no outputs */ 
     : /* input */ "r" (42)); 
+0

Какой процессор это для? В любом случае, используя правильную инструкцию процессора для установки некоторого значения в каком-либо регистре. Обычно мнемоника что-то вроде 'mov',' move', 'set',' let' ... – nrz

+0

Какая архитектура? РУКА..? – Michael

+0

Вы лжете GCC о том, что вы делаете: разделы выходов и сбросов пустые, но вы мутируете содержимое регистра. Вам нужно сообщить gcc, что суби будут мусорным регистром. Поэтому добавьте временный либо в выходы, либо в раздел сбрасывания, и используйте для вывода subi вместо% 0. – moonshadow

ответ

1

Я не пробовал это, но она выглядит:

for (int i = 0; i < N; ++i) 
    { 
    int n = 42; 
    asm("label: substract_immediate_value %0,%0,1;" 
     "compare_immediate_value %0,0;" 
     "branch_not_equal label" 
     : "+r" (n)); 
    } 

Я полагаю, что это упрощенный пример, потому что я не могу себе представить, почему бы вам не просто код, который в C Действительно, это не-op.

+0

Да, я только показываю проблему здесь. Я надеялся на другое решение, но это тот, который я использую до сих пор (и нелюбовь). –

+0

Что вам не нравится в этом? Он сообщает компилятору точно, что ему нужно знать для получения желаемого результата. Дополнительная переменная * необходима *, потому что, как вы обнаружили, запись в константу - это не то, что вы хотите. – ams

 Смежные вопросы

  • Нет связанных вопросов^_^