[ZLG-ARM] 这两个涵数有什么区别?

[复制链接]
2299|8
 楼主| sunny_jgp 发表于 2007-9-11 14:20 | 显示全部楼层 |阅读模式
AD, ADDR, DDR, ui, TE
<br />原涵数:<br />uint16&nbsp;&nbsp;ReadFromNet(uint8&nbsp;ADDR_16)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;uint16&nbsp;temp;<br />temp=(*((volatile&nbsp;unsigned&nbsp;short&nbsp;*)NET_BASE_ADDR+ADDR_16));//0x83400000<br />&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;(temp);<br />}<br />改成这样就不行:<br />uint16&nbsp;&nbsp;ReadFromNet(uint8&nbsp;ADDR_16)<br />{<br />&nbsp;&nbsp;uint16&nbsp;temp;<br />uint32&nbsp;address;<br />address=NET_BASE_ADDR+ADDR_16;<br />temp=(*((volatile&nbsp;unsigned&nbsp;short&nbsp;*)address));//0x83400000<br />&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;(temp);<br />}<br />谁清楚的解译一下,谢谢!
ayb_ice 发表于 2007-9-11 14:37 | 显示全部楼层

address=NET_BASE_ADDR+ADDR_16;可能已经溢出了...

  
 楼主| sunny_jgp 发表于 2007-9-11 14:48 | 显示全部楼层

我还是不能理解

我觉得是不应该溢出的,NET_BASE_ADDR是个常数值,值为:0x83400000,而ADDR_16是一个字节,相加不会溢出吧!这个和temp=(*((volatile&nbsp;unsigned&nbsp;short&nbsp;*)NET_BASE_ADDR+ADDR_16));有多大区别;我还是不能理解<br />
ruraliter 发表于 2007-9-11 19:33 | 显示全部楼层

建议你反汇编试一试

你这是C语言,最后都要编译成汇编语言,建议你在编译的时候,同时生成反汇编代码,其中的内存访问方式一目了然<br />个人认为,没有区别,不过没有做过验证
luhuaren 发表于 2007-9-11 21:29 | 显示全部楼层

re

uint16&nbsp;&nbsp;ReadFromNet(uint8&nbsp;ADDR_16)<br />{<br />&nbsp;&nbsp;uint16&nbsp;temp;<br />uint32&nbsp;address;<br />address=&nbsp;(uint32)(NET_BASE_ADDR+ADDR_16);<br />temp=(*((volatile&nbsp;unsigned&nbsp;short&nbsp;*)address));//0x83400000<br />&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;(temp);<br />}<br /><br />或<br />uint16&nbsp;&nbsp;ReadFromNet(uint8&nbsp;ADDR_16)<br />{<br />&nbsp;&nbsp;uint16&nbsp;temp;<br />uint32&nbsp;address;<br />address=&nbsp;(NET_BASE_ADDR+(uint32)ADDR_16);<br />temp=(*((volatile&nbsp;unsigned&nbsp;short&nbsp;*)address));//0x83400000<br />&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;(temp);<br />}<br /><br />这样试验一下,我没看汇编出来的代码。。。<br />
wlsui 发表于 2007-9-11 23:53 | 显示全部楼层

Re:

<br />原涵数:<br />uint16&nbsp;&nbsp;ReadFromNet(uint8&nbsp;ADDR_16)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;uint16&nbsp;temp;<br />temp=(*((volatile&nbsp;unsigned&nbsp;short&nbsp;*)(NET_BASE_ADDR+ADDR_16)));//0x83400000//注意NET_BASE_ADDR+ADDR_16加了()<br />&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;(temp);<br />}<br />与下面应该是等价的:<br />uint16&nbsp;&nbsp;ReadFromNet(uint8&nbsp;ADDR_16)<br />{<br />&nbsp;&nbsp;uint16&nbsp;temp;<br />uint32&nbsp;address;<br />address=NET_BASE_ADDR+ADDR_16;<br />temp=(*((volatile&nbsp;unsigned&nbsp;short&nbsp;*)address));//0x83400000<br />&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;(temp);<br />}<br />&nbsp;<br />
 楼主| sunny_jgp 发表于 2007-9-12 09:18 | 显示全部楼层

我把各自汇编也贴上来了

uint16&nbsp;readRegister(unsigned&nbsp;char&nbsp;address)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />{&nbsp;&nbsp;<br />&nbsp;uint16&nbsp;temp;<br />&nbsp;uint32&nbsp;addr;<br />&nbsp;addr=(uint32)(c_rtl_address+address);<br />&nbsp;temp=(*((volatile&nbsp;unsigned&nbsp;short&nbsp;*)&nbsp;addr));<br />&nbsp;//temp=(*((volatile&nbsp;unsigned&nbsp;short&nbsp;*)&nbsp;c_rtl_address+address));//0x83400000<br />&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;(temp);<br />&nbsp;}<br /><br />[0xe28004c0]&nbsp;*&nbsp;add&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r0,r0,#0xc0000000<br />[0xe24005f3]&nbsp;&nbsp;&nbsp;sub&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r0,r0,#0x3cc00000<br />[0xe1d000b0]&nbsp;&nbsp;&nbsp;ldrh&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r0,[r0,#0]<br />[0xe1a0f00e]&nbsp;&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pc,r14<br /><br />uint16&nbsp;readRegister(unsigned&nbsp;char&nbsp;address)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />{&nbsp;&nbsp;<br />&nbsp;uint16&nbsp;temp;<br />&nbsp;temp=(*((volatile&nbsp;unsigned&nbsp;short&nbsp;*)&nbsp;c_rtl_address+address));//0x83400000<br />&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;(temp);<br />&nbsp;}<br />&nbsp;<br />[0xe59f17d8]&nbsp;*&nbsp;ldr&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r1,0x80002654&nbsp;;&nbsp;=&nbsp;#0x83400000<br />[0xe1a0c080]&nbsp;&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r12,r0,lsl&nbsp;#1<br />[0xe19100bc]&nbsp;&nbsp;&nbsp;ldrh&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r0,[r1,r12]<br />[0xe1a0f00e]&nbsp;&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pc,r14<br /><br />我是用AXD单步设置断点,考下汇编<br />c_rtl_address是个常数值:OX83400000;在汇编中看不出,可以肯定的说下面运行的结果是对的,上面是错的,我用串口监控了数据;<br />很感谢各位的回复,谢谢
dld2 发表于 2007-9-12 09:57 | 显示全部楼层

晕倒

一个常数加1,就是加1.<br />一个指针加一,地址加多少是由这个指针指向的类型决定的。<br />如果这个指针是指向short的指针,指针加一,地址是加二。<br /><br />基础C语言啊。
 楼主| sunny_jgp 发表于 2007-9-12 10:08 | 显示全部楼层

THANKS

谢谢楼上提醒!<br />uint16&nbsp;readRegister(unsigned&nbsp;char&nbsp;address)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />{&nbsp;&nbsp;<br />&nbsp;uint16&nbsp;temp;<br />&nbsp;uint32&nbsp;addr;<br />&nbsp;addr=(c_rtl_address+address*2);<br />&nbsp;temp=(*((volatile&nbsp;unsigned&nbsp;short&nbsp;*)addr));<br />&nbsp;//temp=(*((volatile&nbsp;unsigned&nbsp;short&nbsp;*)&nbsp;c_rtl_address+address));//0x83400000<br />&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;(temp);<br />&nbsp;}<br />[0xe59f17d8]&nbsp;*&nbsp;ldr&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r1,0x80002654&nbsp;;&nbsp;=&nbsp;#0x83400000<br />[0xe0810080]&nbsp;&nbsp;&nbsp;add&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r0,r1,r0,lsl&nbsp;#1<br />[0xe1d000b0]&nbsp;&nbsp;&nbsp;ldrh&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r0,[r0,#0]<br />[0xe1a0f00e]&nbsp;&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pc,r14<br /><br /><br />现在运行结果正确了<br />
您需要登录后才可以回帖 登录 | 注册

本版积分规则

10

主题

33

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部