欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

ARM汇编

程序员文章站 2022-06-09 08:25:05
...

五,ARM汇编
ARM汇编
1,程序=数据结构+算法
2,与硬件相关的语言-汇编
1)诞生的背景
为了下与机器的微指令,上与内核的C语言的承上启下的交流功能。
2) 什么样子?
ARM汇编
代码结构:
ARM汇编
3) 利用工具ADS通过虚拟设备调式来学习汇编
4) ARM汇编指令格式
Operation {cond} Rd, Rn , Operand2
3,指令 条件Cond和状态Status码

  1. 条件码Cond
    ARM汇编
    2)状态码status
    ARM汇编
    4,立即数
    如:#02
    井号开头的数
    立即数的范围:要被4整除
    5,寻址方式
    ARM汇编
    1)arm堆栈的几个概念
    满堆栈(栈满)
    空堆栈(栈空)
    递增堆栈(进栈)
    递减堆栈(出栈)

6,操作数(ALU操作数)
数学操作
ARM汇编
ARM汇编
逻辑操作
ARM汇编

1)S标签
2)关于逻辑运算
ARM汇编
比较操作
ARM汇编

7,内存操作-读取内存
1)单寄存器读写指令
ARM汇编
STR:按一个字存储到内存
LDR:按一个字从内存读取
STRB:按一个字节存储到内存
LDRB:按一个字节从内存读取
LDRH:按一个半个字(2字节)从内存读取
STRH:按一个半个字(2字节)存储到内存
LDRSB:有符号按一个字节从内存读取
STDRSH:有符号按一个半个字(2字节)存储到内存
2)多寄存器内存访问指令
ARM汇编

3)数据交换指令
ARM汇编

示例代码:

 AREA testhello,CODE,READONLY
        ENTRY   
        CODE32   

START
        MOV R1,#0x1f   
        MOV R0,#0x20   
        SWP     R1,R1,[R2]   
           
        LDMIA R1,{R2,R3,R4,R5}   
        STMIA R0,{R2,R3,R4,R5}   
           
        LDMIB R1,{R2-R8}   
        STMDA R0,{R4-R9}   
           
           
        LDRB R0,[R1,#0x13]   
        STRB R0,[R1,#0x14]   
           
           
        MOV R2,#0x00400   
        CMP R1,#0x04   
        TST     R1,#0x00200   
        TEQ     R1,#0x01000   
           
        SBC     R0,R1,R2   
           
        AND     R0,R1,R2   
        BIC R3,R1,R2   
        ORR     R4,R1,R2   
        EOR     R5,R1,R2   
           
           
        MOV R1,#0xFFFFFFFF   
        MOV     R2,#0x03   
        UMULL R3,R4,R1,R2   
           
        ADC R0,R1,#1   
        SUBS R0,R1,R2   
           
        ADD R1,R1,#0x12    
        ADD R2,R2,#0x11   
        ADD R3,R2,R1   
           
        MVN R0,#0x0f   
           
        MOV R1,#0x01   
        MOV R2,#0xff   
        ADDS R0,R1,R2   
        ADC R4,R0,#0x01   
           
        ADD R3,R2,#0x40   
        MOV     R1,R3   
        MVN     R0,#4   
        MVN     R2,#0x0FF   
        SUB     R4,R2,R0   

    END

8,跳转,状态操作
ARM汇编
例1:
MOV LR,PC//将PC的当前地址赋值给LR寄存器,即LR跳转到当前指令语句
B:短指令跳转,只能上下跳转32个字节。
例子2:汇编跳转语句
跳转顺序: B WangWu ; break to WangWu
——>WangWu——>BL Zhangsan
——>Zhangsan——> MOV PC,LR
——>继续执行Wangwu之后的语句

        AREA testhello,CODE,READONLY
        ENTRY
        CODE32

START
        MOV R1,#0x1f
        MOV R0,#0x20
        SWP     R1,R1,[R2]
        
        B WangWu ; break to WangWu
        MOV PC,#0x12
        LDMIA R1,{R2,R3,R4,R5}
        STMIA R0,{R2,R3,R4,R5}
        
Zhangsan
        LDMIB R1,{R2-R8}
        STMDA R0,{R4-R9}
        LDRB R0,[R1,#0x13]
        STRB R0,[R1,#0x14]
        MOV PC,LR
        
WangWu
        MOV R2,#0x00400
        CMP R1,#0x04
        TST     R1,#0x00200
        TEQ     R1,#0x01000
        BL Zhangsan
        
        SBC     R0,R1,R2
        AND     R0,R1,R2
        BIC R3,R1,R2
        ORR     R4,R1,R2
        EOR     R5,R1,R2
        
        
        END

BL Zhangsan:将当前的PC地址保存在了LR寄存器中,为MOV PC,LR时能够返回该地址。
例子3:arm汇编实现if(){ return hello ;}语句

BL hello //将hello函数的地址存放到LR寄存器并跳转到hello
        SBC     R0,R1,R2 
        AND     R0,R1,R2  
        BIC R3,R1,R2 0
hello
        ORR     R4,R1,R2 
        EOR     R5,R1,R2  
        CMP R11,#0x00  //将R11的值和值#0x00比较(相当于if())
    MOVEQ PC,LR //若R11的值和值#0x00相等,则将LR里寄存的hello的地址给PC,然后程序返回(return hello)到hello函数继续执行。

例子4:汇编实现循环语句while(1);

 loop
    ...其他语句
    BL lopp

例子5:将状态寄存器里的数转移到普通寄存器里;CPSR——>R0

MRS R0,CPSR

状态寄存器操作
ARM汇编

例子5:将普通寄存器里的数转移到状态寄存器里;R0——>CPSR

MOV R0,#0x12
MSR CPSR_cxsf,R0//将R0值写进去
MRS R3,CPSR//再将写进去的值读出来查看

_cxsf:域即32全部生效

异常产生指令
ARM汇编

9,伪指令(类似于宏定义)
1)伪指令作用和类别
ARM汇编
如下伪指令:
ARM汇编
2)基本常用伪指令
ARM汇编
ARM汇编
ARM汇编
例子1: 给寄存器起别名

SRegister RN R0 //通过RN 给R0起别名为SRegister 
        MOV SRegister,#0x12

例子2: EQU声明一个宏定义

WGCON1 EQU 0x32000000 //声明宏WGCON1  

【注意】伪指令要左边顶格写,否则出错
3)在汇编语言程序中常用的符号
<I>符号命名约定
ARM汇编

<2>符号变量
ARM汇编
例子:定义变量

    GBLA count1 //定义变量 count1 
count1 SETA 0x2//给count1赋值,记住立即数 不用加#号
    LDR R0,=count1//将 count1 的值 赋给R0
    
    GBLL Bit2 
 Bit2 SETL {TRUE}
    
    GBLS Name
  Name SETS "wanggang"
   

定义一堆寄存器的别名
如:

Reist RLIST {R0-R8} //通过RLIST将R0 ~ R8 起别名为Relist
 LDMIA R2,RLIST //通过 LDMIA 命令将以R2为基地址的内存块内容读取到Relist寄存器群中
 

<3>常量

常量赋值:

LDR R0,=0x12//直接将0x12值用=赋给R0就行

<4>变量代换$

<5>表达式和运算符

4)寄存器操作

5)数据定义伪汇编
 

例子:用DCB指令在内存以字节为单位分配一片空间,然后将写入相应设置的值

docontrol DCB 0x01,0x02,0x3,0x04 //通过DCB为四个字节0x01,0x02,0x3,0x04起个别名docontrol
    ADR R2,docontrol//将这四个字节存储到以R2为基地址的一片连续的字节地址空间
或也可以是字符,字符存储的是字符的ascll码
docontrol DCB “hello" //通过DCB为"hello"起个别名docontrol
    ADR R2,docontrol//将这个"hello"的ascll码存储到以R2为基地址的一片连续的字节地址空间

6)控制伪指令

例子:IF ELSE ENDIF语句

GBLL Bit2
Bit2 SETL {TRUE}

        IF Bit2 ={TRUE}
                MOV R4,#0x06
        ELSE
                MOV R1,#0x05
        ENDIF

例子:WHILE WEND

        GBLA age
age SETA 0x18
    WHILE age < 0x20
age SETA 0x21
    WEND

例子:定义一个名为helloworld的宏
ARM汇编

 

相关标签: ARM嵌入式开发