共2条
1/1 1 跳转至页
HotPower,C51 HotPower等熟悉C51的大侠来指导一下
问
unsigned char ni;
ni >>=4;
这个语句是什么效果,
我用Keil C51 V7.20 编译,结果如下:
0028 7804 MOV R0,#04H
002A ?C0053:
002A A2E7 MOV C,ACC.7 ;郁闷中...
002C 13 RRC A
002D D8FB DJNZ R0,?C0053
其中,MOV C,ACC.7 这句是否多此一举?
是否有另一种表达方式可以取消这个 MOV C,ACC.7,
郁闷中... 答 1: RE: unsigned char ni;
ni >>=4;
这个语句是将ni向右移动4位,高位补0。
从你这个汇编结果来看,并不是这个语句汇编的结果。
而应该是下边这两条语句汇编来的:
signed cahr ni;
ni>>=4;
而
unsigned char ni;
ni >>=4;
汇编的结果应该是:
MOV A,0x?? ;address of "ni"
SWAP A
ANL A,#0x0F
MOV 0x??,A 答 2: 这应该是个有符号字符数右移的编译结果没什么郁闷的.
0028 7804 MOV R0,#04H
002A ?C0053:
002A A2E7 MOV C,ACC.7 ;取符号位
002C 13 RRC A;保持4次移位后的符号位不变
002D D8FB DJNZ R0,?C0053
我编译的结果:
11: void main(void)
12: {
13: signed char ni =-5;
C:0x0CAE 753BFB MOV 0x3B,#0xFB
14: ni >>= 4;
C:0x0CB1 E53B MOV A,0x3B
C:0x0CB3 7804 MOV R0,#0x04
C:0x0CB5 A2E7 MOV C,0xE0.7
C:0x0CB7 13 RRC A
C:0x0CB8 D8FB DJNZ R0,C:0CB5
C:0x0CBA F53B MOV 0x3B,A
11: void main(void)
12: {
13: unsigned char ni =-5;
C:0x0CD1 753BFB MOV 0x3B,#0xFB
14: ni >>= 4;
C:0x0CD4 E53B MOV A,0x3B
C:0x0CD6 C4 SWAP A
C:0x0CD7 540F ANL A,#0x0F
C:0x0CD9 F53B MOV 0x3B,A
我估计是楼主将signed char ni =-5;改为unsigned char ni =-5;后忘记了编译.
或某个设置选项有问题,重新编译应该就好了.
答 3: 很可能是bug我是很少使用signed 类型的,声明变量很多都是使用 unsigned ...
这次我实际上是使用一个声明变量为 (unsigned char ni)的函数,最后怎么样也没有办法把这个要传送的参数编译unsigned char 状态。
即使使用强制转换符(unsigned char)也不行。 答 4: 我也一直用Keil C51 V7.20在做验证时确实发现几次,但好象都没存盘就编译,而且都是从signed改为unsigned的瞬间。
但后来怎么都出不来了,还“有些怪可惜”的。。。
ni >>=4;
这个语句是什么效果,
我用Keil C51 V7.20 编译,结果如下:
0028 7804 MOV R0,#04H
002A ?C0053:
002A A2E7 MOV C,ACC.7 ;郁闷中...
002C 13 RRC A
002D D8FB DJNZ R0,?C0053
其中,MOV C,ACC.7 这句是否多此一举?
是否有另一种表达方式可以取消这个 MOV C,ACC.7,
郁闷中... 答 1: RE: unsigned char ni;
ni >>=4;
这个语句是将ni向右移动4位,高位补0。
从你这个汇编结果来看,并不是这个语句汇编的结果。
而应该是下边这两条语句汇编来的:
signed cahr ni;
ni>>=4;
而
unsigned char ni;
ni >>=4;
汇编的结果应该是:
MOV A,0x?? ;address of "ni"
SWAP A
ANL A,#0x0F
MOV 0x??,A 答 2: 这应该是个有符号字符数右移的编译结果没什么郁闷的.
0028 7804 MOV R0,#04H
002A ?C0053:
002A A2E7 MOV C,ACC.7 ;取符号位
002C 13 RRC A;保持4次移位后的符号位不变
002D D8FB DJNZ R0,?C0053
我编译的结果:
11: void main(void)
12: {
13: signed char ni =-5;
C:0x0CAE 753BFB MOV 0x3B,#0xFB
14: ni >>= 4;
C:0x0CB1 E53B MOV A,0x3B
C:0x0CB3 7804 MOV R0,#0x04
C:0x0CB5 A2E7 MOV C,0xE0.7
C:0x0CB7 13 RRC A
C:0x0CB8 D8FB DJNZ R0,C:0CB5
C:0x0CBA F53B MOV 0x3B,A
11: void main(void)
12: {
13: unsigned char ni =-5;
C:0x0CD1 753BFB MOV 0x3B,#0xFB
14: ni >>= 4;
C:0x0CD4 E53B MOV A,0x3B
C:0x0CD6 C4 SWAP A
C:0x0CD7 540F ANL A,#0x0F
C:0x0CD9 F53B MOV 0x3B,A
我估计是楼主将signed char ni =-5;改为unsigned char ni =-5;后忘记了编译.
或某个设置选项有问题,重新编译应该就好了.
答 3: 很可能是bug我是很少使用signed 类型的,声明变量很多都是使用 unsigned ...
这次我实际上是使用一个声明变量为 (unsigned char ni)的函数,最后怎么样也没有办法把这个要传送的参数编译unsigned char 状态。
即使使用强制转换符(unsigned char)也不行。 答 4: 我也一直用Keil C51 V7.20在做验证时确实发现几次,但好象都没存盘就编译,而且都是从signed改为unsigned的瞬间。
但后来怎么都出不来了,还“有些怪可惜”的。。。
共2条
1/1 1 跳转至页
回复
有奖活动 | |
---|---|
【有奖活动】分享技术经验,兑换京东卡 | |
话不多说,快进群! | |
请大声喊出:我要开发板! | |
【有奖活动】EEPW网站征稿正在进行时,欢迎踊跃投稿啦 | |
奖!发布技术笔记,技术评测贴换取您心仪的礼品 | |
打赏了!打赏了!打赏了! |