打印

问一下圈圈,这个反汇编我这样理解对吗?(已想通)

[复制链接]
3950|37
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
jiyiche|  楼主 | 2009-4-17 10:55 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
以下是你在一个帖子里回复的程序段:"
void main(void)
{
     unsigned int i;
     ((unsigned char data *)i)[0]=TH0;
     ((unsigned char data *)i)[1]=TL0;
}

编译后的汇编代码:

    22: void main(void)
    23: {
    24:         unsigned int i;
    25:         ((unsigned char data *)i)[0]=TH0;
C:0x000F    A809     MOV      R0,0x09
C:0x0011    A68C     MOV      @R0,TH0(0x8C)
    26:         ((unsigned char data *)i)[1]=TL0;
C:0x0013    E8       MOV      A,R0
C:0x0014    04       INC      A
C:0x0015    F8       MOV      R0,A
C:0x0016    A68A     MOV      @R0,TL0(0x8A)
    27: }
C:0x0018    22       RET 
"
我这里对((unsigned char data *)i)[0]=TH0有两种理解:一种是“把i的值强制转换成指向uchar类型的指针,对该指针指向的地址上的内容赋值”。
一种是“把i的地址强制转换成指向uchar类型的指针,对该指针指向的地址上的内容赋值”(以上面对比,“i的值”变成了“i的地址”)。
我觉得第一种是正确的,也就是把i的值强制转换,因为这里不是
((unsigned char data *)&i)[0]=TH0//(将i取址后再强制转换)
但如果真的是第一种理解,为何i的值一开始就是0x09呢?

相关帖子

来自 2楼
computer00| | 2009-4-17 15:28 | 只看该作者

你把指针的特性搞清楚就明白了。

在C语言里面,要访问一个变量,需要指令两个属性:①这个变量的地址;②这个变量的类型。

所以,对于指针的使用,你只要搞清楚,这个指针所指向的地址,以及要访问的类型就完全明白了。

例如((unsigned char data *)i)[0]=TH0这句,将i的值强制转换为unsigned char data型的指针的地址值,然后按照这种类型去访问这个地址开始的第一个元素。
相当于:
unsigned char data *p;
p=i;  //事实上直接这样写编译一般通不过,因为类型不匹配,所以需要强制转换下:p=(unsigend char data *)i;
*p=TH0;  //它和p[0]等价,事实上写成0[p]一般也能通过编译,因为它又等价于*(p+0)=TH0;

使用特权

评论回复
板凳
jiyiche|  楼主 | 2009-4-17 11:02 | 只看该作者

我想懂了

  想了很久,看了很久,突然发现原来0x09没加#,是直接寻址,不是立即数直接寻址。
  晕。。不好意思,打扰各位了

使用特权

评论回复
地板
xwj| | 2009-4-17 11:21 | 只看该作者

呵呵,LZ聪明!

使用特权

评论回复
5
囗 ̄▓﹋凵| | 2009-4-17 11:32 | 只看该作者

sfr16 T016 = 0x8C;

sfr16 T0_16   = 0x8C;

main()
{
   unsigned int i;
   
   i = T016;
}

使用特权

评论回复
6
yewuyi| | 2009-4-17 11:37 | 只看该作者

俺看到类如((unsigned char data *)i)[0]=TH0;就发晕

就想逃跑,所以俺永远都是C的菜鸟和白痴

使用特权

评论回复
7
yewuyi| | 2009-4-17 11:38 | 只看该作者

有什么好办法可以克服这个心理障碍?!

使用特权

评论回复
8
音乐乐乐| | 2009-4-17 12:19 | 只看该作者

ls, 罚你抄写((unsigned char data *)i)[0]=TH0

一百遍可能有帮助!

使用特权

评论回复
9
computer00| | 2009-4-17 13:18 | 只看该作者

看看微机原理

使用特权

评论回复
10
HUANGQI412| | 2009-4-17 13:33 | 只看该作者

恩,罚抄课文,,,

使用特权

评论回复
11
yewuyi| | 2009-4-17 13:46 | 只看该作者

倒塌了,我的意思是:俺喜欢简单点,

直观明了最好,所以一看见那么麻烦的使用方法,一般都闪过不看。。。。。。

使用特权

评论回复
12
yewuyi| | 2009-4-17 13:47 | 只看该作者

100遍很容易完成的

CTRL+C
CTRL+V

按100下不需要1分钟。。。

使用特权

评论回复
13
computer00| | 2009-4-17 13:49 | 只看该作者

这个还晕?类型知道吧?强制类型转换知道吧?指针知道吧

指针指向的变量会访问吧?就这么多了。

使用特权

评论回复
14
HWM| | 2009-4-17 13:55 | 只看该作者

是有点晕,不过若你整明白数组名的本质后就不晕了。

使用特权

评论回复
15
yewuyi| | 2009-4-17 15:04 | 只看该作者

呵呵,我只有看指针直接指向变量时才不晕。。。

其它的时候多数都要发晕。

特别是看到函数指针和强制类型后的指针使用更是特别的晕。。。

使用特权

评论回复
16
yewuyi| | 2009-4-17 15:06 | 只看该作者

呵呵,记得很久以前有人讲:

不能熟练掌握指针的使用,就是不能熟练掌握C。


很有道理,呵呵,所以,俺是菜鸟。


欢迎在菜鸟园地对我进行扫盲。。。

使用特权

评论回复
17
yewuyi| | 2009-4-17 15:08 | 只看该作者

~~

俺只要一看到HOTPOWER,所长、XWJ等上一堆那类似的东西,俺一般都撒腿就跑。。。



如果不跑,肯定晕倒。。。

使用特权

评论回复
18
xwj| | 2009-4-17 15:36 | 只看该作者

唉,等你明白一切类型都是“数数数数”之后,你就不晕了

不懂? 
先在纸上画格子吧,然后每次涂黑N个排...

--这个幼儿园的小朋友都会哦

使用特权

评论回复
19
yewuyi| | 2009-4-17 16:21 | 只看该作者

晕倒,彻底晕倒。。。

非要俺说的那么透彻吗?!

俺的意思就是:
为什么要直接写成那么长的一串:((unsigned char data *)i)[0]=TH0;
为什么不写成:unsigned char data *p=(unsigend char data *)i;
              *p=TH0;
第一种写法多数都要让人晕倒,当然在这里还算是比较简单的,还能将就着看,但我以前经常见到有人稀里哗啦的写上一长溜(*)(@)(*@)这样的东西,第二种写法简单明了,多好,就是我这样的菜鸟也能看懂,但如果弄上那么一长溜,我一般比较怕怕的。。。

洗碗机太毒了,竟然让俺画格子去,还每次涂黑N个排,嘿嘿,我要BS你。。。

使用特权

评论回复
20
xwj| | 2009-4-17 17:12 | 只看该作者

呵呵,你那样就多出个*p来了

虽然实际上可以被优化掉:-)

当然,
要更好理解的话应该这样写:
unsigned char data *p;
p=&i;           //注意:p是指针,只能赋予地址
*p=TH0;
*(p+1)=TL0;

但为了简便,我一般会直接写成:
*  ( (unsigned char *)(&i) )  =TH0;

我觉得这样很容易理解
至于蛋蛋那种用数组的方法,确实没必要

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

176

主题

484

帖子

0

粉丝