汇编笔记

/********************************************************************************************************
    目前常用的ARM汇编有2种:ARMASM和GNU ARM ASM,二者略有不同,以下以GNU ARM ASM为主                        *
********************************************************************************************************/

1. 汇编系统预定义的段名
        .text    -    代码段:用来存放程序执行代码的一块内存区域,通常是只读的
        .rodata    -    只读数据段:用来存放字符串和#define定义的常量,也是只读的
        .data    -    数据段:用来存放程序中已初始化的全局变量和静态变量,属于静态内存分配区域,可读可写
        .bss    -     BSS段:用来存放程序中未初始化的全局变量和静态变量,也属于静态内存分配区域,可读可写
        
        备注:    之所以将data和bss区分开,因为系统会为bss段的变量初值清0
    
2. 汇编程序的缺省入口时_start标号,也可以在链接脚本(.lds for arm)中用ENTRY标志指明程序入口位置

3. ARM GNU 汇编伪指令汇总:
        .global symbol    -    定义一个全局符号,通常是为lds链接脚本使用(同ARMASM中的EXPORT)
                            例        .global _start
        .word     value    -    在当前位置放一个32bit的值,这个值就是value(同ARMASM中的DCD)
                            例        FIQ_STACK_START:
                                    .word     0x0badc0de    // 就是在当前地址,即FIQ_STACK_START处,放入一个值0x0badc0de
        .equ     symbol,    value    -    类似C中的#define,为一个符号赋值(同ARMASM中的EQU)
                            例        .equ    COUNT    0x80000000    // 等同于#define COUNT 0x80000000
                        
4. 任何汇编行的基本格式:
        [<标签>:][<指令>]
        备注:GNU ARM ASM中,任何以冒号结尾的都被认为是一个标签,标签可以理解为C中的函数名,实质是一个地址
        
5. ldr指令:不论ARMASM还是GNU ARM ASM中,ldr都有2种用法
    ldr作为加载指令时的格式        ldr{条件} 目的寄存器,<存储器地址>        // 用法:从存储器地址中读取32位的数据到通用寄存器
                                ldr            r0,        [r1]                // 将存储器地址为r1的32位数据读入寄存器r0
                                ldr            r0,        [r1,r2]                // 将存储器地址为r1+r2的32位数据读入寄存器r0
                                ldr            r0,        [r1,#8]                // 将存储器地址为r1+8的32位数据读入寄存器r0
                                ldr            r0,        [r1,r2]!            // 将存储器地址为r1+r2的32位数据读入寄存器r0,并将新地址r1+r2写入r1
                                ldr            r0,        [r1,r2,lsl#2]!        // 将存储器地址为r1+r2*4上的32位数据读入寄存器r0,必将新地址r1+r2*4写入r1
    ldr作为伪指令时的格式        ldr            Rn,        =expr                // 将常量expr读入寄存器Rn
    
    备注:    汇编中的大括号{}通常表示里面的选项是可选的
            汇编中的中括号[]通常表示取里面地址中的数据,类似于C语言指针的作用
            汇编中的叹号!通常表示操作完成后,新地址要被写入前一个寄存器
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值