【发布时间】:2013-09-05 18:32:35
【问题描述】:
我有以下代码:
unsigned short wrLine;
unsigned short prev = ((wrLine - 1) % 16);
wrLine = (wrLine + 1) % 16;
这会产生以下反汇编:
unsigned short prev = ((wrLine - 1) % LINES_IN_FIFO);
0041456A movw r3, #25282
0041456E movt r3, #8192
00414572 ldrh r3, [r3]
00414574 uxth r3, r3
00414576 add.w r2, r3, #4294967295
0041457A mov.w r3, #15
0041457E movt r3, #32768
00414582 ands r3, r2
00414584 cmp r3, #0
00414586 bge #10
00414588 add.w r3, r3, #4294967295
0041458C orn r3, r3, #15
00414590 add.w r3, r3, #1
00414594 strh r3, [r7, #4]
wrLine = (wrLine + 1) % LINES_IN_FIFO;
0041463E movw r3, #25282
00414642 movt r3, #8192
00414646 ldrh r3, [r3]
00414648 uxth r3, r3
0041464A add.w r2, r3, #1
0041464E mov.w r3, #15
00414652 movt r3, #32768
00414656 ands r3, r2
00414658 cmp r3, #0
0041465A bge #10
0041465C add.w r3, r3, #4294967295
00414660 orn r3, r3, #15
00414664 add.w r3, r3, #1
00414668 uxth r2, r3
0041466A movw r3, #25282
0041466E movt r3, #8192
有趣的是,如果 wrLine 为零,那么 prev 最终将等于 0xFFFF,而当 wrLine 为 15 时,它将最终等于 0x0000。知道为什么只有其中一个有效吗?
谢谢, 德文
【问题讨论】:
-
我认为,A % 16 更有效的方法是 A & 15。
-
@AndreySmorodov,如果能产生更高效的代码,任何体面的编译器都应该弄清楚这些转换。
-
你在哪里初始化 wrLine?我正在尝试重新创建您在这里所做的事情,但不确定“何时”wrLine 设置为 15 或 0。
-
所以,当我初始化
unsigned short wrLine = 15;时,我得到 prev = 14,而不是 0。当unsigned short wrLine = 0;时,prev == FFFF;。您正在使用什么编译器/环境? -
预计当 wrLine 设置为 0 时,(0 - 1) prev 解析为 -1(0xffff 表示无符号),但我无法重现您遇到的“0”错误。
标签: c integer-arithmetic operands