我刚刚开始在 AVR-GCC 中试验内联汇编器。我正在研究一个宏,它将两个 8 位无符号整数相乘并将结果存储在一个 16 位无符号整数中,用于没有硬件乘法的 AVR,比使用标准 C 函数的速度更快。代码是:
#ifndef UMULTFIX_H_
#define UMULTFIX_H_
#include <inttypes.h>
#define umultfix(a,b) \
({ \
uint16_t product; \
uint8_t multiplier = a, multiplicand = b, count = 9;\
asm volatile ( \
"mov %A0, %1 \n\t" \
"ldi %B0, 0 \n\t" \
"clc \n\t" \
"mult: ror %B0 \n\t" \
"ror %A0 \n\t" \
"dec %3 \n\t" \
"breq end \n\t" \
"brcc mult \n\t" \
"clc \n\t" \
"adc %B0, %2 \n\t" \
"rjmp mult \n\t" \
"end: \n\t" \
:"=&r" (product): "a" (multiplier), "a" (multiplicand), "a" (count)\
); \
product; \
})
#endif /* UMULTFIX_H_ */
问题是我只能使用这个宏一次 - 编译器不喜欢在插入宏以对不同的参数集进行乘法时重新定义“mult:”和“end:”。有没有办法解决?