打印
[ZLG-ARM]

关于ldr指令的问题

[复制链接]
1459|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
zlg_arm|  楼主 | 2007-5-3 09:52 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我在学习arm汇编的时候感觉很奇怪,为什么使用ldr指令取得的程序段语句标号的值和使用adr指令的值是不一样的?!
使用ldr始终不能取得正确的地址值!!!这是为什么?

源代码如下
N    equ    10

    area    example,code,readonly
    entry
    code32

START    ldr        sp,        =0x40003f00
此处--〉    ldr        r3,        =FUN
    mov        r0,        #N
    mov        r1,        r0
    add        r3,        r3,        #1
    stmfd    sp!,    {r1-r12,lr}
    bx        r3
STOP    ldmfd    sp!,    {r1-r12,lr}
    b        START
            
        
        
    code16
FUN    cmp        r0,        #0
    beq        RET
LOOP    sub        r1,        r1,        #1
    add        r0,        r1,        r0
    cmp        r1,        #0
    bne        LOOP
RET    ldr        r3,        =STOP
    ldr        r2,        =0x01
    bic        r3,        r2
    bx        r3
        
        
    end        

相关帖子

沙发
zlgARM| | 2007-5-4 12:20 | 只看该作者

zlg_arm

建议您先看一下我们的参考书里,关于LDR和ADR指令的区别。宛城布衣翻译的那份《ARM常用指令集》也值得参考。如果自己学会找到答案和解决问题的方法,进步会更快,也不需要再看别人的心情和脸色,毕竟这种基本概念的问题别人一般都没义务回答您,您也无需对别人抱以太高希望。:)

使用特权

评论回复
板凳
zlg_arm|  楼主 | 2007-5-4 14:28 | 只看该作者

谢谢周公提醒

谢谢周公提醒

使用特权

评论回复
地板
zlg_arm|  楼主 | 2007-5-4 20:03 | 只看该作者

还是有点疑问

我看了,汇编代码也找了!
我觉得很奇怪的一点就是,为什么在thumb的指令中,使用ldr加载了一个地址,为什么这个地址的指向是该指令的高地址位,比如该指令是在0x4000001c,0x4000001d这两个地址空间内保存,并且我在这条thumb指令之前加了语句标号FUN,然后使用ldr  r1,=FUN加载这个地址,虽然执行的时候没有任何问题!但是这条指令加载的值确是0x4000001d,这是我觉得很奇怪的地方!我看了我使用的都是小端模式的!

代码如下
        area    example,code,readonly
        entry
        code32
        
    
Start    cmp        r0,        #0
        adr        r7,        FUN+1
        bx        r7
        cmp r0,r1
        cmp r0,r1
        cmp r0,r1
        cmp r0,r1

        
        
        code16
        
FUN        cmp r0,r2
        cmp r0,r2
        cmp r0,r2
        ldr    r1,=FUN
        
        cmp r0,r2
        cmp r0,r2
        cmp r0,r2
        mov    pc,r1

        end        

使用特权

评论回复
5
zlg_arm|  楼主 | 2007-5-4 20:05 | 只看该作者

不解

反汇编后如下代码
Start    [0xe3500000]   cmp      r0,#0
00000004    [0xe28f7011]   add      r7,pc,#0x11 ; #0x1d
00000008    [0xe12fff17]   bx       r7
0000000c    [0xe1500001]   cmp      r0,r1
00000010    [0xe1500001]   cmp      r0,r1
00000014    [0xe1500001]   cmp      r0,r1
00000018    [0xe1500001]   cmp      r0,r1
FUN        [0x4290]   cmp      r0,r2  <--此处
0000001e        [0x4290]   cmp      r0,r2
00000020        [0x4290]   cmp      r0,r2
00000022        [0x4902]   ldr      r1,0x0000002c ; = #0x0000001d <--此处
00000024        [0x4290]   cmp      r0,r2
00000026        [0x4290]   cmp      r0,r2
00000028        [0x4290]   cmp      r0,r2
0000002a        [0x468f]   mov      pc,r1
0000002c    [0x0000001d]   dcd      0x0000001d  ....

使用特权

评论回复
6
zlg_arm|  楼主 | 2007-5-4 20:20 | 只看该作者

求证

第一个问题的原因也就在这里,就是应为adr取得是的低地址,而ldr取得是高地址?我在书里面没有找到关于这方面的说明阿?

使用特权

评论回复
7
zlg_arm|  楼主 | 2007-5-4 20:23 | 只看该作者

奇怪

但是在arm状态下adr和ldr的结果是一样的,都是取得4字节指令的低地址!就是在thumb状态下不一样了!

使用特权

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

本版积分规则

17

主题

72

帖子

0

粉丝