共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网站征稿正在进行时,欢迎踊跃投稿啦 | |
奖!发布技术笔记,技术评测贴换取您心仪的礼品 | |
打赏了!打赏了!打赏了! |
打赏帖 | |
---|---|
【笔记】生成报错synthdesignERROR被打赏50分 | |
【STM32H7S78-DK评测】LTDC+DMA2D驱动RGBLCD屏幕被打赏50分 | |
【STM32H7S78-DK评测】Coremark基准测试被打赏50分 | |
【STM32H7S78-DK评测】浮点数计算性能测试被打赏50分 | |
【STM32H7S78-DK评测】Execute in place(XIP)模式学习笔记被打赏50分 | |
每周了解几个硬件知识+buckboost电路(五)被打赏10分 | |
【换取逻辑分析仪】RA8 PMU 模块功能寄存器功能说明被打赏20分 | |
野火启明6M5适配SPI被打赏20分 | |
NUCLEO-U083RC学习历程2-串口输出测试被打赏20分 | |
【笔记】STM32CUBEIDE的Noruletomaketarget编译问题被打赏50分 |