历史上的今天
返回首页

历史上的今天

今天是:2025年05月06日(星期二)

正在发生

2018年05月06日 | 系统学习ARM之四 --GNU的伪指令集

2018-05-06 来源:eefocus

转载自http://blog.csdn.net/qqliyunpeng/article/details/48791487


一、伪指令 的含义:

    伪指令是编译器支持的指令,不是硬件芯片支持的指令。

    编译器在编译时,会把伪指令转化对应的芯片支持的指令。

        伪指令集包括:伪操作和伪指令

二、伪操作:

1. 数据定义(Data Definition)伪操作:

    数据定义伪操作一般用于为特定的数据分配存储单元,同时可完成已分配存储单元的初始化。 

    常见的数据定义伪操作有如下几种:

         .byte                 单字节定义                .byte     0x12,’a’,23

         .short                定义2字节数据 .short    0x1234,65535

         .long /.word     定义4字节数据 .word     0x12345678

         .quad                 定义8字节 .quad     0x1234567812345678

         .float                  定义浮点数 .float    0f3.2

         .string/.asciz/.ascii   定义字符串   .ascii   “abcd\0”,

              注意:.ascii  伪操作定义的字符串需要每行添加结尾字符 '\0',其他不需要

例子:

    int val = 0x11223344;

    val:

    .word  0x11223344

    注意:

        1--变量的定义放在,stop后,.end前

        2--标号是地址的助记符,标号不占存储空间。

2. 汇编控制伪操作:

    (1).if .else .endif    ---- 类似c语言里的条件编译

            汇编控制伪操作用于控制汇编程序的执行流程

        .if、.else   .endif伪操作能根据条件的成立与否决定是否执行某个指令序列。

        当.if后面的逻辑表达式为真,则执行.if后的指令序列,否则执行.else后的指令序列;

         .if、.else、.endif伪指令可以嵌套使用。

 

          .if  logical-expressing

         …

          .else

            …

          .endif

    (2).macro,.endm   --- 类似c语言里的宏函数    

        macro伪操作可以将一段代码定义为一个整体,称为宏指令。

        然后就可以在程序中通过宏指令多次调用该段代码。

        其中,$标号在宏指令被展开时,标号会被替换为用户定义的符号。

        宏操作可以使用一个或多个参数,当宏操作被展开时,这些参数被相应的值替换。

   语法格式:

   .macro    {$label} 名字{$parameter{,$parameter}…}

    ……..code

   .endm

注意:先定义后使用

     .macro  func1

        mov r1,#1

        mov r2,#2

        mov r3,#3

    .endm

 

        func1

        func1

        func1

3.  杂项伪操作:

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

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

    .section     .section     expr       定义一个段。expr可以使.text   .data.   .bss

    .text           .text {subsection}   将定义符开始的代码编译到代码段

    .data         .data {subsection}   将定义符开始的代码编译到数据段,初始化数据段

    .bss           .bss {subsection}     将变量存放到.bss段,未初始化数据段

    .align       .align{alignment}{,fill}{,max}  通过用零或指定的数据进行填充来使当前位置与指定边界对齐

        .align  4     --- 16字节 2的4次

        .align  (4)   --- 4字节

    .org        .org offset{,expr}    指定从当前地址加上offset开始存放代码,

        并且从当前地址到当前地址加上offset之间的内存单元,用零或指定的数据进行填充

    _start   汇编程序的缺省入口是_ start标号,用户也可以在连接脚本文件中用ENTRY标志指明其它入口点.

    .global/ .globl :用来声明一个全局的符号

    .end       文件结束

    .include 格式:.include “filename”

       包含指定的头文件, 可以把一个汇编常量定义放在头文件中

    .equ    格式:.equ    symbol,    expression

        把某一个符号(symbol)定义成某一个值(expression).该指令并不分配空间.(c语言的 #define)

     #define  PI  3.1415    ==    .equ   PI, 3.1415


 

三、伪指令 :

关键点:伪指令在编译时会转化为对应的ARM指令

    1. ADR伪指令 :    --把标签所在的地址加载到寄存器中

        ADR伪指令为小范围地址读取伪指令,使用的相对偏移

        范围:当地址值是字节对齐 (8位) 时,取值范围为-255~255,

        当地址值是字对齐 (32位) 时,取值范围为-1020~1020。

      语法格式:

         ADR{cond}   register,label

         ADR      R0,  lable

    2. ADRL伪指令: --将中等范围地址读取到寄存器中

        ADRL伪指令为中等范围地址读取伪指令。使用相对偏移

        范围:当地址值是字节对齐时,取值范围为-64~64KB;

        当地址值是字对齐时,取值范围为-256~256KB

        语法格式: 

            ADRL{cond}  register,label

            ADRL        R0,lable

    3. LDR伪指令: LDR伪指令装载一个32位的常数和一个地址到寄存器。

        语法格式:

            LDR{cond}  register,=[expr|label-expr]

            LDR    R0,=0XFFFF0000

        注意: 

        (1)ldr伪指令和ldr指令区分

                ldr r1,=val  @ r1 = val    是 伪指令

                ldr r2,val   @ r1 = *val    是 arm指令

                .val

               .word 0x11223344

        (2)怎么取用ldr伪指令实现长跳转

                ldr  pc,=32位地址

           (3)编码中解决立即数的问题

                用arm伪指令ldr

                0x999  不是立即数,

                ldr r0,=0x999


推荐阅读

史海拾趣

Embedded Artists公司的发展小趣事

随着业务的不断发展,Embedded Artists公司开始考虑向国际市场扩张。他们与全球各地的合作伙伴建立了紧密的合作关系,共同开发适用于不同市场的嵌入式解决方案。同时,公司还积极参加国际展会和研讨会,与全球同行交流技术心得和市场动态。这些努力使Embedded Artists公司的品牌在国际市场上得到了广泛认可。

帝特(DTECH)公司的发展小趣事

近年来,帝特积极寻求与行业内优秀企业的合作机会。2024年3月,帝特科技与技象科技在广州帝特总部签署战略合作框架协议,双方就物联网通信产品展开深入合作。这一合作不仅有助于帝特在物联网领域的技术积累和业务拓展,也为公司未来的发展注入了新的活力。

BENCENT公司的发展小趣事

随着市场的不断变化和竞争的加剧,BENCENT公司意识到只有不断创新才能在行业中立足。公司加大了研发投入,引进了一批高素质的技术人才,并与其他科研机构展开合作。通过一系列的技术创新,公司成功推出了一系列具有自主知识产权的电子产品,进一步提升了市场竞争力。

Elpida Memory公司的发展小趣事

在成立初期,Elpida Memory凭借先进的技术和强大的研发实力,迅速在全球DRAM市场占据了一席之地。然而,随着市场竞争的加剧和技术的快速发展,Elpida Memory也面临着巨大的挑战。尤其是在2008年全球金融危机爆发后,DRAM市场需求大幅下降,产品价格暴跌,Elpida Memory的经营状况也陷入了困境。

BRIGHT公司的发展小趣事

近年来,BRIGHT公司积极投身于太阳能领域的发展。他们推出了一种创新的商业模式,即帮助用户免费安装太阳能面板,并随后收取服务费。这一模式类似于有线电视的收费方式,有效降低了用户安装太阳能系统的门槛。通过与私人投资者的合作,BRIGHT公司成功承担了安装成本,并致力于向全球提供优质的屋顶太阳能解决方案。这一突破性的举措使得BRIGHT公司在太阳能领域取得了显著的成绩。

Active-Semi公司的发展小趣事

近年来,BRIGHT公司积极投身于太阳能领域的发展。他们推出了一种创新的商业模式,即帮助用户免费安装太阳能面板,并随后收取服务费。这一模式类似于有线电视的收费方式,有效降低了用户安装太阳能系统的门槛。通过与私人投资者的合作,BRIGHT公司成功承担了安装成本,并致力于向全球提供优质的屋顶太阳能解决方案。这一突破性的举措使得BRIGHT公司在太阳能领域取得了显著的成绩。

问答坊 | AI 解惑

[VB]CRC计算小程序 

上传一个用VB编的CRC码生成程序; 源码如下: \'CRC校验码生成Private Function CrcResult(ByVal Data As Long, ByVal Genpoly As Long, ByVal CrcData As Long) As LongDim n As IntegerData = Data * 2For n = 8 To 1 Step -1    ...…

查看全部问答>

国外物联网发展现状

如今,我国的物联网建设正如火如荼地进行,那么国外的物联网发展又是什么情况呢?   日本:打造“无所不在”的便利社会   日本在2004年推出了基于物联网的国家信息化战略U-Japan。“u”代指英文单词“ubiquitous”,意为“普遍存在的,无所不 ...…

查看全部问答>

vxworks中,telnet到设备后,在没有操作的情况下,怎么让telnet能超时自动退出?

vxworks中,telnet到设备后,在没有操作的情况下,怎么让telnet能超时自动退出。在vxworks的源码中,有变量可以设置吗?或者设置一下哪个函数!…

查看全部问答>

调试串口调试信息的问题

串口1我作为调试串口,并且没有加载普通串口的驱动,当内核调试信息输出的时候同时应用程序的TRACE语句也在调试串口输出了,想不明白,帮看看。…

查看全部问答>

初学Zigbee(MiWi),有前辈给指点下如何快速上手不?

-Micrchip MiWi solution. -Demo board都有了 -相关文档也看了不少,总觉得比较浅,望有经验的前辈指点下接下来怎样更全面的学习…

查看全部问答>

【讨论】wince系统下的波形失真问题?

一个采集音频信号并且输出波形的小程序。 在EVC中的模拟器下可以看到比较好的效果,无信号时的零线平滑笔直。 下载到板子上,再运行程序,就会发现零线是一条小锯齿的形状,通过一条音频线将PC与ARM相连,短路相接也还是有锯齿。。。 问问大虾这 ...…

查看全部问答>

哪位高手能用AM402设计一个恒流源

哪位高手能用AM402设计一个恒流源…

查看全部问答>

DK-LM3S9B96开发板相关资料

为感谢论坛再次提供开发板的团购机会,我整理一下相关资料,都是网上转来的,方便大家查找, 本人很喜欢这款开发板,虽然可能又要上课抢购不了了~但还是支持这个活动   一,套件清单及硬件资源 二,相关技术资料     ...…

查看全部问答>

分享给大家IAR 8051 7.30B和破解工具

分享下IAR 8051 7.30B和破解工具,看资源比较老了,不好找,就帮大家分享下吧IAR 8051 7.30B:http://d.1tpan.com/tp2021754957IAR 8051 7.30B破解工具http://d.1tpan.com/tp1727926716…

查看全部问答>