共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电子工程师创研计划】技术变现通道已开启~ | |
发原创文章 【每月瓜分千元赏金 凭实力攒钱买好礼~】 | |
【EEPW在线】E起听工程师的声音! | |
“我踩过的那些坑”主题活动——第001期 | |
高校联络员开始招募啦!有惊喜!! | |
【工程师专属福利】每天30秒,积分轻松拿!EEPW宠粉打卡计划启动! | |
送您一块开发板,2025年“我要开发板活动”又开始了! | |
打赏了!打赏了!打赏了! |
打赏帖 | |
---|---|
【我踩过的那些坑】结构堵孔导致的喇叭无声问题被打赏50分 | |
【我踩过的那些坑】分享一下调试一款AD芯片的遇到的“坑”被打赏50分 | |
电流检测模块MAX4080S被打赏10分 | |
【我踩过的那些坑】calloc和malloc错误使用导致跑飞问题排查被打赏50分 | |
多组DCTODC电源方案被打赏50分 | |
【我踩过的那些坑】STM32cubeMX软件的使用过程中的“坑”被打赏50分 | |
新手必看!C语言精华知识:表驱动法被打赏50分 | |
【我踩过的那些坑】杜绑线问题被打赏50分 | |
【我踩过的那些坑】STM32的硬件通讯调试过程的“坑”被打赏50分 | |
【我踩过的那些坑】晶振使用的问题被打赏100分 |