zoukankan      html  css  js  c++  java
  • ARM 汇编指令 ADR 与 LDR 使用

    简介

    这两个都是伪指令:ADR 是小范围的地址读取伪指令,LDR 是大范围的读取地址伪指令。可实际使用的区别是: ADR 是将基于 PC 相对偏移的地址值或基于寄存器相对地址值读取的伪指令,而 LDR 用于加载 32 位立即数或一个地址到指定的寄存器中。

    以下面的汇编代码为例:

    .global _start
    
    _start:
    	ldr r0, loop
    	adr r0, loop
     	ldr r0, =loop
    
    loop:
     	nop
    

    用以下命令完成汇编、链接操作,并输出反汇编文件

    [root@localhost asm]# arm-linux-gcc asm.S -o asm.o -c
    [root@localhost asm]# arm-linux-ld -Ttext 0x1004 asm.o -o link.elf
    [root@localhost asm]# arm-linux-objdump -D link.elf > link.dis
    

    反汇编代码如下:

    link.elf:     file format elf32-littlearm
    
    
    Disassembly of section .text:
    
    00001004 <_start>:
        1004:	e59f0004 	ldr	r0, [pc, #4]	; 1010 <loop>
        1008:	e28f0000 	add	r0, pc, #0
        100c:	e59f0000 	ldr	r0, [pc, #0]	; 1014 <loop+0x4>
    
    00001010 <loop>:
        1010:	e320f000 	nop	{0}
        1014:	00001010 	andeq	r1, r0, r0, lsl r0
    

    反汇编文件分析

        ARM9 特性:PC 指向当前指令地址 +8 的位置。
    
    1.ldr r0, loop
        这是一条指令,从内存地址 loop 的位置把值读入。在这里 loop 是一个标号(是一个相对程序的表达式),汇编程序计算相对于 PC 的偏移量,并生成相对于 PC 的索引指令:ldr r0, [pc, #4]。执行指令后,r0 = e320f000。
        
    2.adr r0, loop
        这是一条伪指令,总是会被汇编程序汇编为一个指令。汇编程序尝试产生单个 ADD 或 SUB 指令来装载该地址。如果不能在一个指令中构造该地址,则生成一个错误,并且汇编失败。在这里是取得标号 loop 的地址到 r0,该代码可以在和标号相对位置不变的情况下移动:假如这段代码在 0x30000000 运行,那么 adr r0, loop 得到 r0 = 0x3000000c;如果在地址 0 运行,就是 0x0000000c 了。
    
    3.ldr r0, =loop
        这是一条伪指令,是一个相对程序的或外部的表达式。汇编程序将相对程序的标号表达式 label-expr 的值放在一个文字池中,并生成一个相对程序的 LDR 指令来从文字池中装载该值。如果 label-expr 是一个外部表达式,或者未包含于当前段内,则汇编程序在目标文件中放置一个链接程序重定位命令,程序取链接时生成的地址,因此取得的是标号 loop 的绝对地址,这个绝对地址是在链接的时候确定的。它要占用 2 个 32bits 的空间,一条是指令,另一条是文字池中存放 loop 的绝对地址。因此可以看出,不管这段代码将来在什么地方运行,它的结果都是 r0 = 0x00001010。
    

    参考自:blog.sina.com.cn/s/articlelist_1263669380_0_1.html

  • 相关阅读:
    使企点QQ来消息时不自动弹出窗口(以避免错过旧的消息和避免正在回复A时自动定位到B从而影响客服效率)
    8款开源聊天软件
    博客园设置皮肤(宽屏等)及选择文本编辑器
    Windows Server 2019 设置使用照片查看器查看图片
    使windows10重启后打开上次的文件夹和程序
    TinyMCE 5 富文本编辑器好
    wordpress 安装 Elementor PRO 插件(破解版)
    无法打印,提示“windows 打印后台处理程序 没有运行”的解决方案
    第一次将代码提交至git error: failed to push some refs to 'https://gitee.com/xxx/test.git'
    git本地和远程的关联问题
  • 原文地址:https://www.cnblogs.com/GyForever1004/p/9343253.html
Copyright © 2011-2022 走看看