armv8 汇编 绝对地址赋值_GNU风格 ARM汇编语法指南(非常详细)

GNU风格 ARM汇编语法指南(非常详细)

汇编源程序一般用于系统最基本的初始化:初始化堆栈指针、设置页表、操作ARM的协处理器等。这些初始化工作完成后就可以跳转到C代码main函数中执行。

1、GNU汇编语言语句格式

任何Linux汇编行都是如下结构:[:][}@comment

linstruction为指令

ldirective为伪操作

lpseudo-instruction为伪指令

l:为标号,GNU汇编中,任何以冒号结尾的标识符都被认为是一个标号,而不一定非要在一行的开始。

lcomment为语句的注释

下面定义一个"add"的函数,最终返回两个参数的和:

.section .text, “x”

.global add      @ give the symbol “add” external linkage

add:

ADD r0, r0, r1 @ add input arguments

MOV pc, lr   @ return from subroutine

@ end of program

注意:

lARM指令,伪指令,伪操作,寄存器名可以全部为大写字母,也可全部为小写字母,但不可大小写混用。

l如果语句太长,可以将一条语句分几行来书写,在行末用“\”表示换行(即下一行与本行为同一语句)。“\”后不能有任何字符,包含空格和制表符(Tab)。

2、GNU汇编程序中的标号symbol(或label)

标号只能由a~z,A~Z,0~9,“.”,_等(由点、字母、数字、下划线等组成,除局部标号外,不能以数字开头)字符组成。

Symbol的本质:代表它所在的地址,因此也可以当作变量或者函数来使用。

l段内标号的地址值在汇编时确定;

l段外标号的地址值在连接时确定。

Symbol的分类:3类(依据标号的生成方式)。

<1>基于PC的标号。基于PC的标号是位于目标指令前的标号或者程序中数据定义伪操作前的标号。这种标号在汇编时将被处理成PC值加上(或减去)一个数字常量,常用于表示跳转指令”b”等的目标地址,或者代码段中所嵌入的少量数据。

<2>基于寄存器的标号。基于寄存器的标号常用MAP和FIELD来定义,也可以用EQU来定义。这种标号在汇编时将被处理成寄存器的值加上(或减去)一个数字常量,常用于访问数据段中的数据。

<3>绝对地址。绝对地址是一个32位数据。它可以寻址的范围为[0,232-1]即可以直接寻址整个内存空间。

特别说明:局部标号Symbol

局部标号主要在局部范围内使用,而且局部标号可以重复出现。它由两部组成:开头是一个0-99直接的数字,后面紧接一个通常表示该局部变量作用范围的符号。局部变量的作用范围通常为当前段,也可以用ROUT来定义局部变量的作用范围。

局部变量定义的语法格式:N{routname}

lN:为0~99之间的数字。

lroutname:当前局部范围的名称(为符号),通常为该变量作用范围的名称(用ROUT伪操作定义的)。

局部变量引用的语法格式:%{F|B}{A|T}N{routname}

l%:表示引用操作

lN:为局部变量的数字号

lroutname:为当前作用范围的名称(用ROUT伪操作定义的)

lF:指示编译器只向前搜索

lB:指示编译器只向后搜索

lA:指示编译器搜索宏的所有嵌套层次

lTÿ

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值