|
发表于 2019-3-29 20:57:44
|
显示全部楼层
用 ICC 搞了一下(MEGA8),的确是 <<255 了,结论应该是 1<<(i-1) 为零
MAIN.C
- #include "iom8v.h"
- void main(void)
- {
- unsigned char i= 0;
- PORTC= (1<<i)|(1<<(i-1));
- }
复制代码
汇编文件,i 被安排在了 R20,<< 运算就是 lsl8 库,R16 为左操作数(被移数),R17 为右操作数(移数)
汇编 00089 位置显然 R17 直接 R17-=1 了,这样铁定 255,之后 lsl8 就要左移255 次为零了。
ASM.LST
- (0001) #include "iom8v.h"
- (0002)
- (0003) void main(void)
- (0004) {
- (0005) unsigned char i= 0;
- _main:
- i --> R20
- 00087 2744 CLR R20
- (0006) PORTC= (1<<i)|(1<<(i-1));
- 00088 2F14 MOV R17,R20
- 00089 5011 SUBI R17,1
- 0008A E001 LDI R16,1
- 0008B 940E 0096 CALL lsl8
- 0008D 2E20 MOV R2,R16
- 0008E E001 LDI R16,1
- 0008F 2F14 MOV R17,R20
- 00090 940E 0096 CALL lsl8
- 00092 2E30 MOV R3,R16
- 00093 2832 OR R3,R2
- 00094 BA35 OUT 0x15,R3
- 00095 9508 RET
- lsl8:
- 00096 2311 TST R17
- 00097 F019 BEQ 0x009B
- 00098 0F00 LSL R16
- 00099 951A DEC R17
- 0009A CFFB RJMP lsl8
- 0009B 9508 RET
复制代码 |
|