IAR RL78中无法为__saddr创建正确别名?是优化Bug吗?
IAR中通过别名访问特殊功能寄存器时__saddr属性失效问题
我发现IAR在为特殊功能寄存器(SFR)创建别名时,似乎丢失了__saddr属性。
假设我们有如下SFR定义:
__saddr __no_init volatile union { unsigned char P3; __BITS8 P3_bit; } @ 0xFFF03;
现在尝试通过别名间接使用P3:
{ auto &Px = P3; P3 = 0x55; Px = 0x55; }
查看反汇编结果:
P3 = 0x55; 02947 CD0355 MOV S:__A_P3, #0x55 Px = 0x55; 0294A 3603FF MOVW HL, #0xFF03 0294D 5155 MOV A, #0x55 0294F 9B MOV [HL], A
直接写入P3的汇编代码比通过别名写入的更简洁,想请教这是IAR无法对别名应用__saddr属性,还是我的代码存在问题?
复现代码
// 无需真实硬件,可在模拟器运行 #include <ior5f100aa.h> // 可使用任何含P3寄存器的MCU // C++程序 int main(void) { // 直接写入寄存器P3 P3 = 0x55; { // 通过别名间接写入寄存器P3 auto& Px = P3; Px = 0x55; } }
编译运行后反汇编窗口内容:
P3 = 0x55; main(): _main: 00136 CD0355 MOV S:__A_P3, #0x55 auto& Px = P3; 00139 3603FF MOVW HL, #0xFF03 Px = 0x55; 0013C 5155 MOV A, #0x55 0013E 9B MOV [HL], A
内容的提问来源于stack exchange,提问作者rl78family
相关产品推荐
相关产品推荐

