【发布时间】:2019-08-07 08:45:37
【问题描述】:
我正在尝试在 AVR 程序集中执行 %10。
我创建了一个简单的c文件
int main()
{
int k=19;
int j;
j = k%10;
return 0;
}
然后我将其编译成程序集,给出
ldi r24,lo8(19)
ldi r25,0
std Y+2,r25
std Y+1,r24
ldd r24,Y+1
ldd r25,Y+2
ldi r18,lo8(10)
ldi r19,0
mov r22,r18
mov r23,r19
rcall __divmodhi4
std Y+4,r25
std Y+3,r24
ldi r24,0
ldi r25,0
__divmodhi4 是如何工作的,结果存储在哪里?
【问题讨论】:
-
对于除以编译时常数,乘以定点逆并移动高半部分通常更有效。但是,GCC 仅在硬件划分足够宽以在一条乘法指令中执行此操作时才选择这样做。有关 AVR 和 x86-64 GCC 上的
unsigned short foo(unsigned short k) { return k%10;}的 asm,请参见 godbolt.org/z/jOV_b4,-O3。 (无符号除法比有符号除法更简单,因为例如-11 % 10 = -1,因此需要额外的移位才能正确处理符号。)通常查看 asm 以获取接受 args 并返回的函数。 -
@PeterCordes 正如您的 XKCD 卡通所暗示的那样,您是正确的。已移除。 :)
标签: assembly gcc avr modulo integer-division