屌丝学arm汇编-04-ldr的使用小结

来源:互联网 发布:java javaagent 编辑:程序博客网 时间:2024/06/15 00:07

ldr作为用法在arm中比较常见,为了搞清楚其区别今天特意写了一个demo,贴出来把心得记下来。

ADS1.2的工程

代码路径:http://download.csdn.net/download/losting_boy/9620660

//start.s

        AREA    SCopy, CODE, READONLY
COUNT   EQU    0x300
        IMPORT test
        entry
start   
;伪指令                                  
ldr r0,=COUNT         
;跳转方式1(位置不相关)反汇编中有很多类似的用法
ldr    r1,=(test1 - tag)      
mov lr,pc         
add pc,pc,r1         
;跳转方式2      
mov lr,pc         
tag ldr pc,=test      
;跳转方式3      
mov lr,pc         
b test           
;跳转方式4      
bl test          
;加载寄存器r2中地址的内存区间      
ldr r3,[r2]         
mov lr,pc         
b       test2      
test1
mov     r5,#0x1      
mov     pc,lr      
test2
;注意二者的区别,前者是指令对应的内存地址,是代码指令的地址,      
ldr r4,test1         //首先test1其实就是地址,这里加载的[test1]处的内存

ldr r5,=test1      //伪指令,就是test1地址赋值给r5,这个表述有些麻烦最好能调试看下

ldr          r6,=(test2 - test1) //伪指令,赋值test2 - test1

//可以调试下上面三者
stop
b .   
        END

//test.c

#include <stdio.h>
extern int test(int i,int j);
int test(int i,int j)
{    
int c = 0;
i++;//
i = i + 3;
sub_func(10,1,2,3,4,5);
c = c+4;
}

//这个故意写了5个参数,主要是反编译看下ATPCS约定
int sub_func(int a,int b,int c,int d,int f)
{
return a - b - c - d - f;
}

0 0
原创粉丝点击