Ваше утверждение является частичным и в нем отсутствуют определения переменных, используемых для заполнения входных ограничений вашей инструкции по сборке.
Наиболее вероятным кандидатом является выражение [wc] "I" (wc * sizeof(uInt))
, если wc
- это что-то еще, кромеконстанта времени компиляции - "I"
ограничения должны быть оценены немедленно.Также может быть [k] "N" (sizeof(uInt))
, потому что это не соответствует lea
.
. Я бы предложил изменить выражение на:
asm (
"lea (%[base], %[off], %[k]), %[base]\n\t"
"neg %[off]\n\t"
"clc\n\t"
"lo: "
"lods %[ax]\n\t"
"lea (%[base], %[off], %[k]), %[la]\n\t"
"adc %[ax], (%[la])\n\t"
"inc %[off]\n\t"
"jnz lo\n\t"
"jnc %l[nocarry]\n"
:
: [k] "I"(sizeof(uInt)), [base] "d" (th), [oz] "S" (oz),
[la] "b" (0), [ax] "a" (0), [off] "c" (wc)
:
: nocarry
);
, но вы можете захотеть оценить возможность компиляциибольше свободы выбора (как, скажем, [base] "r" (th + wc)
при условии th
- uInt*
).Точно так же, с вашими инструкциями по сборке, нет явной необходимости использовать "a"
, "b"
, "c"
или "d"
, так что вы искусственно ограничиваете, какой компилятор может выбрать.Если это то, что вам нужно, возможно, лучше написать / написать функцию полностью в ассемблере, чем пытаться принудительно заставить компилятор.