ARM 1.11

1.如何理解指针?

指针是一种变量,它存储了一个内存地址。通过指针,我们可以直接访问和操作内存中的数据。理解指针的关键是理解以下几个概念:

  1. 内存:计算机的内存是用来存储数据的地方,每个内存单元都有一个唯一的地址。

  2. 变量:变量是存储在内存中的数据,它们有自己的类型和值。

  3. 地址:每个变量在内存中都有一个地址,指针存储的就是这个地址。

  4. 指针变量:指针变量是存储地址的变量,它的类型是指向某种数据类型的指针。

  5. 解引用:通过指针可以访问和修改指针所指向的内存地址上的数据,这个过程称为解引用。

通过理解这些概念,我们可以更好地理解指针的作用和使用方法。指针可以用于动态分配内存、传递参数、操作数组等。在C和C++等编程语言中,指针是一项重要的概念,掌握指针的使用对于理解和编写高效的代码非常重要。

swi后面的数字是什么意思?

  在汇编语言中,SWI(Software Interrupt)是一个特殊的指令,用于触发软件中断。在某些处理器架构中,软件中断被用来实现系统调用或者与操作系统的功能进行交互。

SWI 指令后面通常会跟着一个数字,这个数字被称为软件中断号(Software Interrupt Number)。这个数字用于标识不同的软件中断。操作系统会根据这个数字来决定应该执行哪个中断处理程序。

例如,在 ARM 架构中,SWI 指令后面可以跟一个 8 位或 24 位的软件中断号。8 位的软件中断号范围是 0 到 255,而 24 位的软件中断号范围是 0 到 16777215。这些中断号是全局唯一的,操作系统会根据这些中断号来识别和响应相应的软件中断。

数据和指令类型

ARM采用的是32位架构
ARM约定:
Byte:8 bits
Halfword:16 bits (2 byte)
Word:32 bits (4 byte)
Doubleword:64-bits(8byte) (Cortex-A处理器)
大部分ARM core 提供:
ARM 指令集(32-bit)
Thumb 指令集(16-bit )
Cortex-A 处理器
16 位和 32 位 Thumb-2 指令集
16 位和 32 位 ThumbEE 指令集
Jazelle cores 支持 Java bytecode
ARM有7个基本工作模式
User:非特权模式,大部分任务执行在这种模式
FIO:当一个高优先级 (fast) 中断产生时将会进入这种模式
IRQ:当一个低优先级(normal) 中断产生时将会进入这种模式
Supervisor:当复位或软中断指令执行时将会进入这种模式
Abort:当存取异常时将会进入这种模式
Undef:当执行未定义指令时会进入这种模式
System:使用和User模式相同寄存器集的特权模式
Cortex-A特有模式:
Monitor:是为了安全而扩展出的用于执行安全监控代码的模式;也是一种特权模式
异常处理
当异常产生时 , ARM core:
        拷贝 CPSR 到 SPSR_
        设置适当的 CPSR 位: 偏移向量表
        改变处理器状态进入 ARM 态
        改变处理器模式进入相应的异常模式
        设置中断禁止位禁止相应中断 (如果需要)
        保存返回地址到 LR_
        设置 PC 为相应的异常向量
返回时, 异常处理需要:
        从 SPSR_恢复CPSR
        从LR_恢复PC
        Note:这些操作只能在 ARM 态执行
偏移向量表
0x1C               FIQ
0x18                IRQ
0x14                Reserved
0x10                Data Abort
0x0C                Prefetch Abort
0x08                Software Interrupt
0x04                Undefined Instruction
0x00                Reset
指令流水线
为增加处理器指令流的速度,ARM7 系列使用3级流水线
允许多个操作同时处理,而非顺序执行
PC指向正被取指的指令,而非正在执行的指令
对齐
存储器访问必须始终适当地保持地址对齐
        非对齐地址将产生不可预测的/未定义的结果
用‘Data Abort’ 异常来检测无效的非对齐数据存取
        需要额外的扩展逻辑,或者MMU来实现
        谨防指令读取时出现非对齐
非对齐数据存取能够完成, 但不是用 LDR
        使用 LDRB, STRB 传递字节,或使用LDM 加移位/屏蔽
ARM汇编中的文件格式
基于ARM的工程源代码由以文件形式组织。
ARM源程序文件(可简称为源文件)可以由任意一种文本编辑器来编写程序代码,它一般为文本格式。在ARM程序设计中,常用的源文件可简单分为以下几种:
ARM 1.11_第1张图片

ARM汇编语言程序格式
       
        ARM汇编语言是以段(section)为单位来组织源文件的。段是相对独立的、具有特定名称的、不可分割的指令或者数据序列。
        段又可以分为代码段和数据段,代码段存放执行代码,数据段存放代码运行时需要的数据。
        一个ARM源程序至少需要一个代码段,大的程序可以包含多个代码段和数据段。
        在汇编文件中,我们需要先定义一个段,在段中添加我们实现的汇编程序语句。
ARM 1.11_第2张图片

ARM汇编语言语句格式如下所示:
        {symbol} {;comment}
其中:
        instruction                             为指令。
        directive                                为伪操作。
        pseudo-instruction              为伪指令。
        symbol                                  为标号。
        comment                              为语句的注释。
ARM 1.11_第3张图片

指令分类及指令格式
ARM 指令集可以分为六大类
        1.分别为数据处理指令 ( 完成 CPU 内部的计算)
        2. Load/Store指令 ( 完成 CPU 与内存 IO 外设之间的数据传输)
        3. 跳转指令 ( 完成程序的跳转)
        4. 程序状态寄存器处理指令 ( 完成 CPSR 的管理 )
        5. 协处理器指令 ( 完成 CPU 扩展功能的实现 )
        6. 异常产生指令 ( 用户程序异常触发 )
指令格式中符号说明
        〈opcode〉{〈cond〉}{S} 〈Rd〉,〈Rn〉{,〈operand2〉}
opcode         操作码;指令助记符,如 LDR 、 STR 等。
cond             可选的条件码;执行条件,如EQ、NE 等。
S                  可选后缀;若指定“S”,则根据指令执行结果更新CPSR中的条件码。
Rd                目标寄存器。
Rn                存放第1操作数的寄存器。
Operan         d2 第 2 个操作数
数据处理指令
  算术指令:
ADD        ADC        SUB        SBC        RSB        RSC
位运算指令:
AND        ORR        EOR        BIC
比较指令:
CMP        CMN        TST        TEQ
数据搬移:
MOV        MVN
上述指令只能对寄存器操作,不能针对存储器。
语法:
        <操作>{}{S} Rd, Rn, Operand2
          只有比较指令影响标志位 -不指定Rd
        数据搬移(MOV指令)不指定Rn
第二个操作数通过桶型移位器送到ALU中。    
条件码
下表为所有可能的条件码:
注意:AL为默认状态,不需要单独指出
ARM 1.11_第4张图片

立即数
没有任何一条 ARM 指令可包括一个 32 bit 的立即数
         所有的ARM指令都是32 bits固定长度
数据处理指令格式中,第二个操作数有 12 位
4 bit 移位值 (0-15) 乘于 2 ,得到一个范围在 0-30 ,步长为 2 的移位值
记住一条准则:“最后 8 位一定要移动偶数位”
  下列命令中,汇编器把立即数转换为移位操作:
        MOV r0, #4096                            ;uses 0x40 ror 26
        ADD  r1, r2, #0xFF0000               ;uses 0xFF ror 16
也可使用 MVN来进行位反转:
        MOV r0, #0xFFFFFFFF               ;assembles to MVN r0 , # 0
立即数不能使用上述方法产生,否则将导致错误。  
装载32 bit常数
    为允许装载大常数,汇编器提供了一条伪指令:
        LDR rd, =const
它可能汇编成下列指令:
        MOV or MVN

        LDR 指令,从数据池(Literal pools)读取常数。
For example
        LDR r0, =0xFF => MOV r0,#0xFF
        LDR r0, =0x55555555 => LDR r0,[PC,#Imm12]
        …
        …
        DCD 0x55555555
建议把常数装载到寄存器中时一律使用该伪指令。    

你可能感兴趣的:(arm开发)