关于ldr指令的问题(2),请求正解

[复制链接]
3705|11
 楼主| zlg_arm 发表于 2007-5-4 20:40 | 显示全部楼层 |阅读模式
还是有点疑问&nbsp;<br /><br />我看了,汇编代码也找了!<br />我觉得很奇怪的一点就是,为什么在thumb的指令中,使用ldr加载了一个地址,为什么这个地址的指向是该指令的高地址位,比如该指令是在0x4000001c,0x4000001d这两个地址空间内保存,并且我在这条thumb指令之前加了语句标号FUN,然后使用ldr&nbsp;&nbsp;r1,=FUN加载这个地址,虽然执行的时候没有任何问题!但是这条指令加载的值确是0x4000001d,这是我觉得很奇怪的地方!我看了我使用的都是小端模式的!<br /><br />代码如下<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;area&nbsp;&nbsp;&nbsp;&nbsp;example,code,readonly<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;entry<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;code32<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />Start&nbsp;&nbsp;&nbsp;&nbsp;cmp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r0,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#0<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;adr&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r7,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FUN+1<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bx&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r7<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cmp&nbsp;r0,r1<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cmp&nbsp;r0,r1<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cmp&nbsp;r0,r1<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cmp&nbsp;r0,r1<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;code16<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />FUN&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cmp&nbsp;r0,r2<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cmp&nbsp;r0,r2<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cmp&nbsp;r0,r2<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ldr&nbsp;&nbsp;&nbsp;&nbsp;r1,=FUN<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cmp&nbsp;r0,r2<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cmp&nbsp;r0,r2<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cmp&nbsp;r0,r2<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp;pc,r1<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><br /><br />反汇编后如下代码<br />Start&nbsp;&nbsp;&nbsp;&nbsp;[0xe3500000]&nbsp;&nbsp;&nbsp;cmp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r0,#0<br />00000004&nbsp;&nbsp;&nbsp;&nbsp;[0xe28f7011]&nbsp;&nbsp;&nbsp;add&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r7,pc,#0x11&nbsp;;&nbsp;#0x1d<br />00000008&nbsp;&nbsp;&nbsp;&nbsp;[0xe12fff17]&nbsp;&nbsp;&nbsp;bx&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r7<br />0000000c&nbsp;&nbsp;&nbsp;&nbsp;[0xe1500001]&nbsp;&nbsp;&nbsp;cmp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r0,r1<br />00000010&nbsp;&nbsp;&nbsp;&nbsp;[0xe1500001]&nbsp;&nbsp;&nbsp;cmp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r0,r1<br />00000014&nbsp;&nbsp;&nbsp;&nbsp;[0xe1500001]&nbsp;&nbsp;&nbsp;cmp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r0,r1<br />00000018&nbsp;&nbsp;&nbsp;&nbsp;[0xe1500001]&nbsp;&nbsp;&nbsp;cmp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r0,r1<br />FUN&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[0x4290]&nbsp;&nbsp;&nbsp;cmp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r0,r2&nbsp;&nbsp;&lt--此处<br />0000001e&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[0x4290]&nbsp;&nbsp;&nbsp;cmp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r0,r2<br />00000020&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[0x4290]&nbsp;&nbsp;&nbsp;cmp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r0,r2<br />00000022&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[0x4902]&nbsp;&nbsp;&nbsp;ldr&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r1,0x0000002c&nbsp;;&nbsp;=&nbsp;#0x0000001d&nbsp;&lt--此处<br />00000024&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[0x4290]&nbsp;&nbsp;&nbsp;cmp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r0,r2<br />00000026&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[0x4290]&nbsp;&nbsp;&nbsp;cmp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r0,r2<br />00000028&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[0x4290]&nbsp;&nbsp;&nbsp;cmp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r0,r2<br />0000002a&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[0x468f]&nbsp;&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pc,r1<br />0000002c&nbsp;&nbsp;&nbsp;&nbsp;[0x0000001d]&nbsp;&nbsp;&nbsp;dcd&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x0000001d&nbsp;&nbsp;....<br /><br />第一个问题的原因也就在这里,就是应为adr取得是的低地址,而ldr取得是高地址?我在书里面没有找到关于这方面的说明阿?<br /><br />但是在arm状态下adr和ldr的结果是一样的,都是取得4字节指令的低地址!就是在thumb状态下不一样了!&nbsp;<br /><br />&nbsp;<br />
 楼主| zlg_arm 发表于 2007-5-5 19:27 | 显示全部楼层

没有人作答??????

没有人作答??????
 楼主| zlg_arm 发表于 2007-5-5 19:29 | 显示全部楼层

求求高手来解答

我找了好几本书了,上面都说adr确实是专门用来加载地址的!<br />但是我看的书上也都写了对于ldr的指令也可以用于32位的常数或者地址的加载,但是这似乎有悖于我的实验程序!!<br /><br />我只想让您给个解释,到底是不是这样的结果,应该说对于两段程序同在arm状态下或者同时在thumb状态下就可以顺利使用ldr指令取得地址,但是如果两段程序跨了状态,尤其是arm下调用thumb的程序,就不可以使用ldr了??<br />在周公您实际的工作中有没有这样的问题!?<br />
wowow 发表于 2007-5-6 10:25 | 显示全部楼层

这似乎是区分ARM/THUMB指令的一个标志

THUMB中的程序地址都是实际地址加1,也就都是奇数。不记得在哪个Pdf提到过。如果没有这个区别,ARM执行时怎么知道调用的是ARM程序还是thumb呢?
 楼主| zlg_arm 发表于 2007-5-6 14:02 | 显示全部楼层

楼上说的不是很对!!请高手给点答案

&nbsp;&nbsp;&nbsp;&nbsp;area&nbsp;&nbsp;&nbsp;&nbsp;example,code,readonly<br />&nbsp;&nbsp;&nbsp;&nbsp;entry<br />&nbsp;&nbsp;&nbsp;&nbsp;code32<br />Start&nbsp;&nbsp;&nbsp;&nbsp;cmp&nbsp;r0,&nbsp;&nbsp;&nbsp;&nbsp;#0<br />&nbsp;&nbsp;&nbsp;&nbsp;adr&nbsp;r7,&nbsp;&nbsp;&nbsp;&nbsp;FUN1+1<br />&nbsp;&nbsp;&nbsp;&nbsp;bx&nbsp;&nbsp;r7<br />&nbsp;&nbsp;&nbsp;&nbsp;cmp&nbsp;r0,r1<br />&nbsp;&nbsp;&nbsp;&nbsp;cmp&nbsp;r0,r1<br />&nbsp;&nbsp;&nbsp;&nbsp;cmp&nbsp;r0,r1<br />&nbsp;&nbsp;&nbsp;&nbsp;cmp&nbsp;r0,r1<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;code16<br />FUN1&nbsp;&nbsp;&nbsp;&nbsp;cmp&nbsp;r0,r2<br />&nbsp;&nbsp;&nbsp;&nbsp;adr&nbsp;r2,FUN&lt--此处<br />&nbsp;&nbsp;&nbsp;&nbsp;ldr&nbsp;r1,=FUN&lt--此处<br />&nbsp;&nbsp;&nbsp;&nbsp;cmp&nbsp;r0,r2<br />FUN&nbsp;&nbsp;&nbsp;&nbsp;cmp&nbsp;r0,r2<br />&nbsp;&nbsp;&nbsp;&nbsp;cmp&nbsp;r0,r2<br />&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;pc,r1<br />&nbsp;&nbsp;&nbsp;&nbsp;end<br /><br />反汇编<br />Start&nbsp;&nbsp;&nbsp;&nbsp;[0xe3500000]&nbsp;&nbsp;&nbsp;cmp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r0,#0<br />40000004&nbsp;&nbsp;&nbsp;&nbsp;[0xe28f7011]&nbsp;&nbsp;&nbsp;add&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r7,pc,#0x11&nbsp;;&nbsp;#0x4000001d<br />40000008&nbsp;&nbsp;&nbsp;&nbsp;[0xe12fff17]&nbsp;&nbsp;&nbsp;bx&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r7<br />4000000c&nbsp;&nbsp;&nbsp;&nbsp;[0xe1500001]&nbsp;&nbsp;&nbsp;cmp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r0,r1<br />40000010&nbsp;&nbsp;&nbsp;&nbsp;[0xe1500001]&nbsp;&nbsp;&nbsp;cmp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r0,r1<br />40000014&nbsp;&nbsp;&nbsp;&nbsp;[0xe1500001]&nbsp;&nbsp;&nbsp;cmp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r0,r1<br />40000018&nbsp;&nbsp;&nbsp;&nbsp;[0xe1500001]&nbsp;&nbsp;&nbsp;cmp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r0,r1<br />FUN1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[0x4290]&nbsp;&nbsp;&nbsp;cmp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r0,r2<br />4000001e&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[0xa201]&nbsp;&nbsp;&nbsp;adr&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r2,0x40000024&lt--此处<br />40000020&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[0x4902]&nbsp;&nbsp;&nbsp;ldr&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r1,0x4000002c&nbsp;;&nbsp;=&nbsp;#0x40000025&lt--此处<br />40000022&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[0x4290]&nbsp;&nbsp;&nbsp;cmp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r0,r2<br />FUN&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[0x4290]&nbsp;&nbsp;&nbsp;cmp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r0,r2<br />40000026&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[0x4290]&nbsp;&nbsp;&nbsp;cmp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r0,r2<br />40000028&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[0x468f]&nbsp;&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pc,r1<br />4000002a&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[0x0000]&nbsp;&nbsp;&nbsp;dcw&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x0000&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;..<br />4000002c&nbsp;&nbsp;&nbsp;&nbsp;[0x40000025]&nbsp;&nbsp;&nbsp;dcd&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x40000025&nbsp;&nbsp;%..@<br /><br />上面的这段代码更加明显的显示了adr和ldr就是取到的值的不一样!这是什么道理啊???没有发现你说的这个理由啊!!
ferry 发表于 2007-5-6 15:00 | 显示全部楼层

re

adr&nbsp;伪指令取相对当前指令偏移的标号地址,这是个相对地址.<br />ldr&nbsp;伪指令取操作数的地址,这是个绝对地址.代码中的操作数是标号的值(=FUN):0x40000025,存放这个值的地址是4000002c.<br />另外注意标号地址是16位地址(code16).
 楼主| zlg_arm 发表于 2007-5-6 15:18 | 显示全部楼层

楼上的有点误解

1、首先adr确实是利用pc来取得FUN标号的地址,但是这只是取得地址手段的不同,不应该会导致值的不同,而且对于使用ldr或者是adr这两种方法取得不同的地址却可以同样的来使用,你可以在最后使用mov&nbsp;pc,r1或者r2来尝试,都可以正确跳转这是我最头痛的!!!<br />2、对于code16的标示,估计您误解了,他的地址还是32位的,只是代码是16位的,所以只需要两个字节来表示,你可以仔细看到ldr和adr这两个指令,前者把值取在指令高地址位,而adr却取在指令低地址位
ferry 发表于 2007-5-6 16:20 | 显示全部楼层

re

1.相对地址绝对地址值是不同的,只有0起点时是相同的.仔细想想.<br />2.code16地址两字节对齐,code32&nbsp;4字节对齐.应该是这个意思.
 楼主| zlg_arm 发表于 2007-5-6 16:38 | 显示全部楼层

问题依旧,严重哦

我明白楼上的意思!那楼上的认为那种方法取得的地址才是正确的?!我不知道应该以那种方法为准!尤其当这种情况在arm状态下取得thumb的地址的时候,那么两种方法取得的值,其中只有adr的是正确的,而ldr的却不能正确执行。在thumb的情况下,两者都可以正确执行!
wowow 发表于 2007-5-6 19:14 | 显示全部楼层

这个要仔细看资料了

参考资料:<br />[1]RVCT&nbsp;3.0&nbsp;Developer&nbsp;Guide<br />http://www.arm.com/pdfs/DUI0203G_rvct_developer_guide.pdf<br />[2]RVCT&nbsp;3.0&nbsp;Assembler&nbsp;Guide<br />http://www.arm.com/pdfs/DUI0204G_rvct_assembler_guide.pdf<br /><br />[1]中page&nbsp;4-10<br />Exporting&nbsp;symbols<br />If&nbsp;you&nbsp;export&nbsp;a&nbsp;symbol&nbsp;that&nbsp;references&nbsp;Thumb&nbsp;instructions,&nbsp;the&nbsp;linker&nbsp;automatically&nbsp;adds&nbsp;one&nbsp;to&nbsp;the&nbsp;address&nbsp;of&nbsp;any&nbsp;label&nbsp;in&nbsp;Thumb&nbsp;code.<br /><br />If&nbsp;you&nbsp;do&nbsp;not&nbsp;export&nbsp;a&nbsp;symbol,&nbsp;you&nbsp;must&nbsp;manually&nbsp;add&nbsp;one&nbsp;to&nbsp;the&nbsp;symbol&nbsp;that&nbsp;references&nbsp;the&nbsp;Thumb&nbsp;instructions.&nbsp;In&nbsp;Example&nbsp;4-2&nbsp;on&nbsp;page&nbsp;4-9&nbsp;it&nbsp;is&nbsp;ThumbProg+1.&nbsp;This&nbsp;is&nbsp;because&nbsp;all&nbsp;references&nbsp;are&nbsp;resolved&nbsp;by&nbsp;the&nbsp;assembler,&nbsp;and&nbsp;the&nbsp;linker&nbsp;never&nbsp;detects&nbsp;the&nbsp;symbol.<br /><br />[2]中page&nbsp;2-29&nbsp;2.5.3&nbsp;Loading&nbsp;with&nbsp;LDR&nbsp;Rd,&nbsp;=const<br /><br />[1]中的第四章都值得一看。<br /><br />结论:<br />adr指令中引用的是FUN的地址,而LDR引用的是FUN的地址加1后保存在literal&nbsp;pool中的值。
ferry 发表于 2007-5-6 21:39 | 显示全部楼层

arm和thumb的切换问题

楼主的问题我想大概是这样,ldr的操作数是4字节的,是code32,而现在处在code16,因此取这个值要做一次code16到code32的切换,应在ldr后加一条bx&nbsp;[r1]切换语句,以保证跳转的地址值是4字节。又这个地址值是指向code16地方的,所以又要做一次code32到code16的切换,这次切换是通过+1实现的,这就是0x40000024+1=0x40000025,汇编程序帮你处理好了。<br />&nbsp;
 楼主| zlg_arm 发表于 2007-5-6 23:13 | 显示全部楼层

非常感谢!!牛人!!

非常感谢!!牛人!!得到正解!!!哈哈<br />看来是要多多看看这些文档了!!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

17

主题

72

帖子

0

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