ARM汇编

五,ARM汇编

1,程序=数据结构+算法
2,与硬件相关的语言-汇编
1)诞生的背景
为了下与机器的微指令,上与内核的C语言的承上启下的交流功能。
2) 什么样子?

代码结构:

3) 利用工具ADS通过虚拟设备调式来学习汇编
4) ARM汇编指令格式
Operation {cond} Rd, Rn , Operand2
3,指令 条件Cond和状态Status码

  1. 条件码Cond

    2)状态码status

    4,立即数
    如:#02
    井号开头的数
    立即数的范围:要被4整除
    5,寻址方式

    1)arm堆栈的几个概念
    满堆栈(栈满)
    空堆栈(栈空)
    递增堆栈(进栈)
    递减堆栈(出栈)

6,操作数(ALU操作数)
数学操作


逻辑操作

1)S标签
2)关于逻辑运算

比较操作

7,内存操作-读取内存
1)单寄存器读写指令

STR:按一个字存储到内存
LDR:按一个字从内存读取
STRB:按一个字节存储到内存
LDRB:按一个字节从内存读取
LDRH:按一个半个字(2字节)从内存读取
STRH:按一个半个字(2字节)存储到内存
LDRSB:有符号按一个字节从内存读取
STDRSH:有符号按一个半个字(2字节)存储到内存
2)多寄存器内存访问指令

3)数据交换指令

示例代码:

 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,跳转,状态操作

例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

状态寄存器操作

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

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

_cxsf:域即32全部生效

异常产生指令

9,伪指令(类似于宏定义)
1)伪指令作用和类别

如下伪指令:

2)基本常用伪指令



例子1: 给寄存器起别名

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

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

WGCON1 EQU 0x32000000 //声明宏WGCON1  

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

<2>符号变量

例子:定义变量

    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的宏

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值