历史上的今天
返回首页

历史上的今天

今天是:2025年01月12日(星期日)

2020年01月12日 | ARMGNU伪指令

2020-01-12 来源:eefocus

符号定义伪指令

.global,.local,.set,.equ


.global

使得符号对连接器可见,变为对整个工程可用的全局变量


.global symbol

.local

表示符号对外部不可见,只对本文件可见


.local symbol

.set

给一个全局变量或局部变量赋值,和.equ的功能一样


.set symbol expr

.set start, 0x40

.set start, 0x50

mov r1, #start      ;r1里面是0x50

.equ

和.set一样,只是格式不同


symbol .equ  expr

start  .equ, 0x40

start  .equ, 0x50

mov r1, #start      ;r1里面是0x50

数据定义伪指令

.byte,.short,.long,.quad,.float,.string,.asciz,.ascii,.rept


.byte

在存储器中分配1个字节,用指定的数据对存储单元进行初始化


label:  .byte   expr    ;label是程序标号,expr可以是-128~255的数字,也可是字符

a:  .byte   #1  ;等价于C中的char a=1;

.short

在存储器中分配2个字节,用指定的数据对存储单元进行初始化


a: .short 0x1234

.word / .long

在存储器中分配4个字节,用指定的数据对存储单元进行初始化


a: .word 0x12345678

.long

在存储器中分配个字节,用指定的数据对存储单元进行初始化


.quad

在存储器中分配8个字节,用指定的数据对存储单元进行初始化


a: .quad 0x12345678 ;等价于C中的long a=0x1234567812345678

.float

在存储器中分配4个字节,用指定的浮点数据对存储单元进行初始化


a: .float 1.11

.space/.skip

用于分配一块连续的存储区域并初始化为指定的值,如果后面的填充值省略不写则在后面填充为0;


label: .space size,expr     ;expr可以是4字节以内的浮点数 

a:  space 8, 0x1

.string

定义一个字符串,默认是string8,还有string16,string32,string64


a: .string "hello world!"

.rept

重复执行接下来的指令,以.rept开始,以.endr结束


.rept cnt   ;cnt是重复次数

...

.endr

汇编控制伪操作

流程控制伪指令主要yy.if .else .endif .macro .endm .exitm


.if .else .endif

.if logical-expression

...

.elseif logical-expression2

...

.else

...

.endif

.macro .endm .exitm

该伪指令可以将一段代码定义为一个整体,称为宏指令,然后就可以在程序中通过宏指令多次调用该段代码,而.exitm指令用来退出当前的宏指令,宏指令可以使用一个或多个参数,当宏操作被展开时,这些参数被相应的值替换。

包含在.macro和。endm之间的指令序列称为宏定义体。在宏定义体的第一行应声明宏的原型,包含宏名所需的参数,然后就可以在汇编程序中通过宏名来调用该指令序列,在源程序被编译时,汇编器将宏调用展开,用宏定义中的指令序列代替程序中的宏调用,并将实际参数的值传递给宏定义中的形式参数


.macro macroname macargs ...

;code

.endm

杂项

.align      用于使程序当前位置满足一定的对齐方式

.section    用来定义一个段的伪指令

.data       用来定义一个数据段

.text       用来定义一个代码段

.include    用来包含一个头文件   

.arm        定义以下代码使用arm指令集编译

.code 32    同.arm

.code 16    同.thumb

.thumb      定义以下代码使用thumb指令集编译

.extern     用于声明一个外部符号,用于兼容性其他汇编

.weak       用于声明一个弱符号,如果这个符号没有定义,编译就忽略,而不会报错

.end        表示汇编结束

ADR

把标签所在的地址加载到寄存器中,这个指令将基于PC相对偏移的地址值或基于寄存器相对偏移的地址值读取到寄存器中。当地址值是字节对齐的时候,取值范围是-255~255B;当地址值是字对齐的时候,取值范围为-1020~1020B。当地址值是16字节对齐时,取值范围更大。 该指令等价于add , pc , offset


ADR

ADRL

用于将中等范围地址读取到寄存器中


ADRL

LDR

装载一个32位的常数和一个地址寄存器


LDR reg, =expr

reg:目标寄存器

expr:32位常量表达式。汇编器根据expr的取值情况,对LDR伪指令做如下处理:


当expr表示的指令地址值没有超过MOV指令或MVN指令的地址取值范围时,汇编器用一对MOV和MVN代替LDR指令

当超过了的时候,汇编器将常数放入缓存吃,同时用一条基于PC的LDR读取该常数

LDR R3,=0xff0

;将常熟0xff0读到内存中相当于MOV R3, #0xff0


LDR R1,=0xfff   

;将常数0xfff读到内存,

;相当于LDR R1,[pc, offset_to_litpool]  ... litpool DCD 0xfff


LDR R2, =place  

;将place标号的地址读入到R1中

;相当于LDR R1,[pc, offset_to_litpool]  ... litpool DCD place


推荐阅读

史海拾趣

E Connector Solutions公司的发展小趣事

随着公司业务的不断发展,E Connector Solutions公司开始积极拓展市场。公司通过参加国际展会、与海外客户建立合作关系等方式,逐步打开了国际市场的大门。同时,公司还积极实施国际化战略,通过设立海外研发中心、生产基地等方式,加强与全球客户的合作与交流。这些举措不仅拓宽了公司的业务范围,还提升了公司的国际竞争力。

Focus公司的发展小趣事

Focus Enhancements, Inc.(根据参考文章中的信息)是一家无晶圆厂集成电路(IC)公司,专注于为家庭影院系统、便携式媒体播放器、智能手机等消费电子设备开发和销售IC解决方案和组件。自1996年以来,该公司凭借其强大的研发团队和敏锐的市场洞察力,不断推出创新产品,赢得了包括微软、东芝、LG、索尼等全球知名OEM厂商的青睐。随着物联网和智能设备的兴起,Focus Enhancements加大了对低功耗、高性能芯片的研发力度,成功拓展了智能家居、可穿戴设备等领域的应用市场。

芯力微(CHI Power)公司的发展小趣事

面对日益激烈的市场竞争,芯力微不断推动创新,以应对市场的变化。在电源管理领域,公司不断研发新技术、新产品,以满足客户日益增长的需求。同时,芯力微还积极拓展新的应用领域,如物联网、汽车电子等,为公司的发展开辟了新的道路。这种持续的创新精神使得芯力微在电子行业中始终保持领先地位。

FTCAP Fischer & Tausche Capacitor Group公司的发展小趣事

芯力微深知人才是企业发展的核心动力。因此,公司一直注重人才的培养和引进。公司建立了一套完善的人才培养机制,为员工提供广阔的发展空间和良好的职业前景。同时,芯力微还积极引进国内外优秀人才,打造了一支高素质、专业化的团队。这支团队不仅具备丰富的行业经验和技术能力,还具备高度的责任感和使命感。他们为公司的发展贡献了自己的智慧和力量。

DCCOM [ DC COMPONENTS ]公司的发展小趣事

为了进一步扩大市场份额,DCCOM公司积极寻求与国内外知名企业的合作。通过与这些企业的合作,DCCOM不仅获得了更多的客户资源,还学习到了先进的管理经验和技术知识。这种合作模式使得DCCOM在激烈的市场竞争中保持了强劲的增长势头。

Facon公司的发展小趣事

在发展过程中,Facon遇到了许多技术难题。然而,他们从未放弃过对技术的追求和突破。经过数年的研究和实践,Facon成功研发出了一款具有划时代意义的低功耗芯片,该芯片在保持高性能的同时,大大降低了能耗,为电子产品的续航能力带来了革命性的提升。这一技术突破让Facon在行业中声名鹊起,吸引了众多合作伙伴的关注。

问答坊 | AI 解惑

AVR(MEGA16)入门教程,详细的图解教程

AVR(MEGA16)入门教程,详细的图解教程…

查看全部问答>

如何用红外对射开关控制继电器

我想用一个红外对射开关控制欧姆龙MY2NJ继电器工作,对射开关的型号见图片 我用黄颜色的线接到继电器,继电器不能工作,继电器都是好的,我用12V电压直接控制继电器,是可以工作的,但用感应的不知道怎么接法。 红外对射开关工作电压是5V,继电器 ...…

查看全部问答>

在动车组两个车厢中的无线传输用什么样的方式更好

想在动车组两个车厢中实现数据的无线传输。 也考虑到一些实现方法,但是由于动车组有屏蔽大,速度快特点,造成无线数据包传输难度很大。 请问各位高手,用什么方式能达到这个目的呢?前提是不对车厢作出改造,比如车体外安装天线等 …

查看全部问答>

smart lcd 和普通lcd有哪些区别,驱动起来有何不同

smart lcd 和普通lcd有哪些区别,驱动起来有何不同?…

查看全部问答>

又是一个石沉大海的问题!!??

如何在驱动代码中,获得U盘的插入?并获得其盘符(注:此U盘无文件系统) 谢谢,有钱的捧个钱场,无钱的捧个情场…

查看全部问答>

Fluke 27-II防水防尘数字多用表精确的使用方法

Fluke 27-II 工业多用表 新型 Fluke 27 II数字多用表树立了在困难情况下进行测量的新标准,它具有优异的功能和准确度,可以轻松解决大多数电气故障。 这款多用表均符合 IP 67(防水和防尘)规格,正在接受 MSHA 的认证审批,并且拥有更广的工作温 ...…

查看全部问答>

网页转换工具FCARM和makefsfile的使用简介

    首先在这里要提一下Keil的网页转换工具FCARM.exe的使用,花费了我好几个小时。TI也有一个类似的程序,是Makefsfile,并且源码公开的。     这个FCARM.exe,一直认为只要这个custom arguments里边设置好了FCarm.exe的路径就可以在勾 ...…

查看全部问答>

有没有可以监视USB数据传送的软件?

                                 就像串口调试时监视串口那种的,谢谢。。。…

查看全部问答>

新手问一个简单的问题

我写了一个简单的求正旋值的c程序: #include<math.h> #define NX 180 #define pi 3.14159 short i; double x[NX]; double r[NX]; void main(void) { for(i=0;i<NX;i++)   {x=pi*i/180;    r=sin(x);   ...…

查看全部问答>