这是什么问题,是编译器的小缺陷吗?

本人最近在用STC12C5A60S2做一个AD电压检测,编写了如下程序

void ADC_SEL(unsigned char shift,unsigned char num)
{
//unsigned char c = 0x1;
P1ASF = num << shift;
}
我想用对num(num = 1)的移位来打开P1口AD允许,但是经过移位后发现P1ASF = 0,于是我截取了如下汇编代码:
反汇编:
C:0x054F ED MOV A,R5
C:0x0550 A807 MOV R0,0x07
C:0x0552 08 INC R0
C:0x0553 8002 SJMP C:0557
C:0x0555 C3 CLR C
C:0x0556 33 RLC A
C:0x0557 D8FC DJNZ R0,C:0555
C:0x0559 F59D MOV P1ASF(0x9D),A
按C语言调用规则,第一个参数是放在R7寄存器里的,也就是说R7里的数是左移位数,但我并没有在代码里看到对R7的处理。而是编译器自作主张将ACC移了8位,那肯定最后就等于零了呀。这是不是编译器的一个小缺陷?编译器我用的Keil4请问各位高手怎么解决?

经过实验,直接对PIASF赋值0xff即可。

不是很懂单片机,P1ASF 在哪里定义的,num << shift;会不会溢出。编译器是否有防止溢出和优化,因为你的函数返回void,所以优化掉了。

你可以在程序初始化写开启一个AD,调试看看这个寄存器写入值正确不

纠正一个错误, MOV R0,0x07是将0x7中的内容赋给r0(MOV Rn,direct形式),第0组工作寄存器组为00H~07H,第1组工作寄存器组为08H~0FH,第2组工作寄存器组为10H~17H,第3组工作寄存器组为18H~1FH,共四组。