GNU编译器常见伪操作

news/2024/11/19 17:42:02/

伪操作不会生成机器码,只是在编译阶段告诉编译器怎么做。类似于C语言中的 #if、#define 等带“#”的,#if 告诉编译器哪段不需要被编译,#define 告诉编译器哪些宏需要替换。

不同编译器,伪操作的语法不一样,这里主要介绍GNU编译器的伪操作。GNU伪操作一般以 “ . ” 开头。括号里的内容表示当前伪操作可被理解成C语言中的哪些内容 或者 该伪操作的含义。


         目录

1、.global / .local(全局 / 局部变量)

2、.equ(宏定义)

3、.byte / .word / .space(动态申请空间) 

4、.weak(符号弱化) 

5、.macro  ...  .endm(函数定义)

6、.if  ...  .endif(条件编译)

7、.rept  ...  .endr(重复生成机器码)

8、.arm / .thumb / .text / .end


1、.global / .local(全局 / 局部变量)

.global 用于定义全局符号,以便于被其他文件引用;.local 用于定义局部符号, 仅在当前文件使用。类似于C语言中的全局变量或者局部变量的声明。

全局符号声明格式:.global  符号

局部符号声明格式:.local  符号

@ 全局 / 局部
@ .local FUNC
.global FUNCFUNC:MOV R1, #1MOV R2, #2

2、.equ(宏定义)

.equal 类似于C语言中的宏定义,达到的效果是一样的。如果操作寄存器时,有多个地方要用到同一个值,这时可以使用 .equal

格式:.equ 符号名,  值

.equ DATA, 0x01    @ 类似于C中的 #define DATA 0x01
MOV R1, #DATA

3、.byte / .word / .space(动态申请空间) 

这三个伪操作的含义如下:

  • .byte 申请一个字节的空间并初始化;
  • .word 申请一个字(4个字节)的空间并初始化;
  • .space 申请任意字节的空间并初始化

这里和C语言不一样,在哪使用了.byte/.word,就会直接在上一条指令的后面申请相应大小的空间,编译器在把指令放到内存中时,会自动跳过这块空间。

(1) .word 

格式:.word  初始值

MOV  R1, #1
.word 0xFFFFFFFF    @ 申请一个字的空间,并初始化为0xFFFFFFFF
MOV  R2, #2

“ MOV  R1, #1 ”生成的指令放在了 0x00000000 的位置;

.word申请的空间紧跟其后,起始地址为 0x00000004;(编译器在存放指令时跳过了该空间)

“ MOV  R2, #2 ”生成的指令放在了 0x00000008 的位置

(2) .byte 

格式:.byte  初始值

指令在被放到内存的时候,需要满足对齐原则,即起始地址必须是 4 的整数倍,这里如果只申请一个字节的空间,放在了 0x00000004 的位置,下一条指令就会放在 0x00000005 的位置,很显然不满足对齐原则。

因此,使用.byte不能照搬上面的写法。

MOV  R1, #1
.byte 0xFF     @ 申请一个字节的空间,并初始化为0xFF
.align 2       @ 表示该语句后续的语句自动对齐
MOV  R2, #2

注意: .align N 表示按照 2的N次方自动对齐

(3) .space 

.space 可以申请任意字节的空间并初始化。

格式:.space 字节数,  初始值

MOV  R1, #1
.space 12, 0x34
MOV  R2, #2

 

4、.weak(符号弱化) 

.weak 表示弱化一个符号,如果在程序里使用了一个未被定义的符号,让编译器不要报错。此时编译器会对用到该符号的语句做一个特殊操作,该语句会替换为NOP,也就是做一个空操作

格式:.weak  符号

.weak FUNC
B FUNC        @ FUNC 未被定义(编译时,该句会执行一个空操作,相当于sleep(10))

5、.macro  ...  .endm(函数定义)

.macro 和 .endm是成对存在的,其作用相当于定义一个函数。

格式:

        .macro   函数名

               ...

        .endm

.macro FUNCMOV R1, #0xFFMOV R2, #0x01
.endm

6、.if  ...  .endif(条件编译)

使用方法和C语言一样,只是把“ # ”换成了“ . ”

格式:

         .if   条件

               ...

        .endif

.if 0                   @该段不会参与编译MOV R1,  0xFFMOV R2, 0x01
.endif

7、.rept  ...  .endr(重复生成机器码)

可以看作是将其范围内的指令重复执行了多次。

格式:

        .rept   重复次数             

                ...

        .endr

.rept  3                @ 生成三段重复的机器码MOV R1,  0xFFMOV R2, 0x01
.endr

8、.arm / .thumb / .text / .end

.arm:告诉编译器,这之后的指令都是ARM指令

.thumb:告诉编译器,这之后的指令都是THUMB指令

.text:表示之后是代码段

.end:表示汇编结束


http://www.ppmy.cn/news/5551.html

相关文章

4G/5G协同无线网工程建设方案

【摘 要】如何处理好4G/5G在资源上的矛盾,解决好二者之间的协同,是当前无线网规划与工程建设面临的新课题。首先结合中国移动5G 2.6 GHz频率使用策略,提出面向4G/5G协同的工程建设方案,随后聚焦4G/5G天面协同,以中国移动现网多制式多频段天馈现状为出发点,提出“最佳三副…

计算机毕设Python+Vue野生动物保护资讯管理系统(程序+LW+部署)

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

C语言学习之路(高级篇)—— 变量和内存分布(下)

说明:该篇博客是博主一字一码编写的,实属不易,请尊重原创,谢谢大家! 程序的内存分区模型 1) 内存分区 1.1 运行之前 我们要想执行我们编写的c程序,那么第一步需要对这个程序进行编译。 预处理&#xf…

C语言编程错误整理集合(不定时更新)

文章目录找出整型数组中最大的整数并输出判断三边是否可以构成直角三角形,若能构成则计算该直角三角形的面积计算输入的三边是否能构成三角形,如果能就计算该三角形的周长和面积利用数组实现逆置(数字和字母)输出五个俩位数整数,并且按照个个…

设计模式-牛刀小试01

前言 本文为datawhale2022年12月组队学习《大话设计模式》task4打卡学习,本次完成homework1。 【教程地址】https://github.com/datawhalechina/sweetalk-design-pattern 一、任务描述 1.1 背景 小李已经是一个工作一年的初级工程师了,他所在的公司是…

【Python机器学习】条件随机场模型CRF及在中文分词中实战(附源码和数据集)

需要源码请点赞关注收藏后评论区留言私信~~~ 基本思想 假如有另一个标注序列(代词 动词 名词 动词 动词),如何来评价哪个序列更合理呢? 条件随机场的做法是给两个序列“打分”,得分高的序列被认为是更合理的。既然要…

新冠确诊阳性后的第一篇博客,一文带你学习SQL注入

新冠确诊阳性后的第一篇博客,一文带你学习SQL注入1.你好SQL注入2.盲注3.Timing Attack4.常见的攻击技巧5.SQL CoIumn Truncation6.防御SQL注入SQL注入防御的误区使用预编译语句使用存储过程SQL注入攻击属于注入攻击的一种,注入攻击的本质,是把…

【Linux 内核 内存管理】物理内存组织结构

一、 UMA和NUMA两种模型 共享存储型多处理机有两种模型 一致内存访问(Uniform-Memory-Access,简称UMA)模型 非一致内存访问(Nonuniform-Memory-Access,简称NUMA)模型 UMA模型 物理存储器被所有处理器件均…