ARM cortex-A8 学习笔记(3) —— ARM 汇编(上)

来源:互联网 发布:sqlserver恢复表数据 编辑:程序博客网 时间:2024/06/08 01:59

          上次学习了关于arm寄存器的有关知识,今天我花了一些时间整理了最近我学习的有关ARM汇编的内容。以下是我学习后整理的笔记,分享给大家,如有任何问题,请各位大神指出。

一、ARM 寻址方式

      寻址方式是根据指令中给出的地址码字段来实现寻找真实操作数地址的方式。说白了,就是处理器根据指令中给出的地址信息来寻找物理地址的方式。以下是常用的几种寻址方式。

      (1)、立即数寻址

        何为立即数?若操作数本身包含在指令中,取出指令也就得到操作数,这个操作数就叫立即数。此寻址方式也称立即数寻址。

需要特别注意:立即数是由一个8位的数经过循环移动偶数位得到的,所以,一个立即数不存在这个8位的常数,这个立即数就不合法。那么,如何判断一个立即数是否合法?可以将该立即数循环左移或右移偶数位,看是否能得到一个小于等于0xFF的数,若能,即该立即数合法,否则,不合法。

        例如:      MOV R1,#0x01         将0x01这个操作数传到R1寄存器中 ,其0x01就是该立即数,前面用“#”作为前缀

                          ADD  R0,R1,#0x01   将R1的数加1后传给R0寄存器。

      (2)、寄存器寻址

       寄存器寻址是利用寄存器中的数值作为操作数进行指令操作。该寻址方式最为常用,执行效率高。

        例如:ADD  R0,R1,R2      将R1和R2寄存器的数值相加后赋给R0寄存器。

      (3)、寄存器间接寻址

       寄存器间接寻址就是把寄存器的值当作成地址指针,根据该地址在存储单元里找到该操作数的方式。

        例如:ADD  R0,R1,[R2]    将R2寄存器的值作为地址,在内存中找到该地址的值,再与R1的值相加,结果赋给R0寄存器。

      (4)、寄存器移位寻址

       寄存器移位寻址就是将寄存器的值进行移位操作后,进行指令操作的方式。

        例如:MOV  R1,R1 , LSL #3      将R1的值左移3位后再赋值给R1寄存器。

                    LSL :左移,空出的位用0填充。                       LSR : 右移,空出的位用0填充

                    ROR:循环右移,移出的字的位依次来填补空出的位。

      (5)、基址变址寻址

        基址变址寻址是将寄存器的值与指令中的地址偏移量相加得到一个新的地址,再通过新地址找到存储空间所对应的值。

        例如: LDR  R0,[R1,#0x03]     将R1 的值加上0x03后作为新地址,在存储单元找到该地址的值,赋值给R0寄存器。

                    LDR  R0,[R1],#4          将R1的值为地址,在存储单元找到对应的值后赋值给R0寄存器,然后R1的值增加4个字节。

      (6)、多级寄存器寻址

        多级寄存器寻址就是一次可以传输几个寄存器的值。一条指令可以完成传输最多16个通用寄存器的值。

       例如:LDMIA  R0,{R1,R2,R3,R4}     将以R0的值为地址的值赋值给R1寄存器后,R0增加4个字节,再将以新的R0的值为地址的值赋值给R2寄存器,依次类推。后缀IA 表示在每次执行加载或存储操作后,源寄存器自增4个字节。

      (7)、堆栈寻址

        堆栈是指一个按照“后进先出”为原则存取的存储区,堆栈指针总是指向栈顶。

        满堆栈:  堆栈指针指向最后一个压入堆栈的数据的位置

        空堆栈:  堆栈指针指向下一个即要放数据的空位置

        递增堆栈: 堆栈是由低地址向高地址生成

        递减堆栈: 堆栈是由高地址向低地址生成

        **注意:满堆栈与空堆栈是两种堆栈工作方式,不能理解成满堆栈就是已经装满的堆栈,空堆栈就是没有被装满的堆栈

        例子:STMFD SP !,{R1-R7,LR}     将R1-R7、LR 压入堆栈中,满递减堆栈

                   LDMED  SP ! ,{R1-R7,LR}   将堆栈中的数据传到R1-R7,LR 寄存器,空递减堆栈

                    满递增堆栈(FA)     满递减堆栈(FD)     空递增堆栈(EA)  空递减堆栈(ED)


 二、汇编常用指令整合

     以下表格需要注意:

         cond 表示条件码即在执行指令前先判断该条件是否成立,若成立,才执行。下面是条件码表

 

S 表示指令执行结果是否影响CPSR寄存器的值

Rd 表示目的寄存器

Rn 表示第一个操作数

OP2 表示第二个操作数

OP23表示第三个操作数

    (1)、数据操作指令



(2)、逻辑操作指令



由于汇编内容较多,内容分成两篇文章,请继续留意 ARM汇编(下)!

以上内容若有错误,请大家指正!