GNU编译器常见伪操作

news2024/11/19 15:37:22

伪操作不会生成机器码,只是在编译阶段告诉编译器怎么做。类似于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 FUNC

FUNC:
    MOV R1, #1
    MOV 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 FUNC
    MOV R1, #0xFF
    MOV R2, #0x01
.endm

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

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

格式:

         .if   条件

               ...

        .endif

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

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

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

格式:

        .rept   重复次数             

                ...

        .endr

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

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

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

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

.text:表示之后是代码段

.end:表示汇编结束

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/106814.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

python帮我省下了这笔冤枉钱

背景 今天不得不说一说我这个电脑的事情。我这个电脑是2年前买的,屏幕非常大,是16寸的。 基本上没什么缺点,就是每隔一年,就要处理一下储存问题。 为什么呢,因为我的这台电脑的储存是512G的。所以不是太大。 但是今天…

【小学信息技术教资面试】《英文汉字巧切换》教案

题目:英文汉字巧切换内容: 基本要求: (1) 请在10分钟内完成试讲。 (2) 灵活切换汉字和英文字符。 (3) 试讲过程中涉及操作,进行演示即可。 《英文汉字巧切换…

如何准备考pmp?

我考的是旧考纲,5A 通过的,备考经验大家可以参考下,取长补短~ 一、复习计划的制定 根据之前在培训班共同奋斗的小伙伴学习时间统计,平均每天的学习时间是在 3-4 小时左右,基本上是白天 1 小时晚上 3 小时左右&#xf…

MySQL (二)------MySQL的使用、SQL的介绍

1.1 MySQL服务的启动 “我的电脑/计算机”-->右键-->“管理”-->“服务”-->启动和关闭MySQL服务 “开始菜单”-->“控制面板”-->“管理工具”-->“服务”-->启动和关闭MySQL “任务管理器”-->“服务”-->启动和关闭MySQL 或者 以管理员…

SQL练习题之求每个部门工资最高的人

冬至,又称日南至、冬节、亚岁。 文章目录前言一、题目二、表数据三、解答方法四、延伸思考题外话前言 分享自己做SQL练习时遇到的经典题目,供各位小伙伴参考。 一、题目 现有员工表employee,求每个部门工资最高的前五个员工的 id, name, de…

硬件系统工程师宝典(1)-----硬件系统设计应该从哪里开始?

系统设计举足轻重的一步,需求分析 今天我们开始读张志伟老师的《硬件系统工程师宝典》,这是一本非常好的入门书,对需求分析,电源、信号完整性,电源完整性,可制造性,原理图,pcb的详细…

风控特征变量如何命名

风控变量的命名相信是各位小伙伴,不管是策略还是模型开发的同学都会经常遇到的问题。如果变量不多,假设变量也就只有十几二十个左右,相信大家也不需要怎么处理,或许下面这样的简单命名方式就好了: 如VAR1~VARN&#x…

一套Abaqus常用子程序的二次开发和复杂应用攻略

当物体所受载荷是比较复杂的函数时(如与时间、位置等相关),通过界面输入的方式已经难以实现,通常便需要借助于DLOAD子程序来实现。下面将就ABAQUS软件的DLOAD子程序进行讲解和应用举例,希望通过此次讲解能够让更多的同…

01背包问题

01背包问题一、01背包问题1、问题描述2、问题性质分析3、动态规划思路(1)状态方程a.状态表示:b.状态转移:(2)循环的设计3、代码模板(1)朴素版(2)优化版一、01背包问题 1、问题描述 2、问题性质分析 这道题…

WEB接口测试之Jmeter接口测试自动化(初次接触)

软件测试自动化从不同的测试阶段分类,可从下层到上层依次分为单元测试-->接口测试-->界面自动化测试。 单元测试一般有开发人员自行完成,而界面自动化测试合适的测试条件又很难达到,测试人员在繁杂的手工界面测试之余, 更…

相信制造业品牌的实力:专访鸿雁全屋智能贵州总代理

作者 | 牧之 编辑 | 小沐 出品 | 智哪儿 zhinaer.cn长期以来,我们一直在讲智能家居市场的下沉,从一二线城市到三四线城市,从沿海到内陆。而事实上,印象中「欠发达」的内陆城市,对于智能家居的接受度可能比我们想象得要…

Qt中调用gRPC

RPC是Remote Procedure Call的简称,中文叫远程过程调用。 gRPC是由 google开发的一个高性能、通用的开源RPC框架,主要面向移动应用开发且基于HTTP/2协议标准而设计,同时支持大多数流行的编程语言。 一.编译gRPC 操作系统:window…

百亿级流量的系统架构该怎么设计,今天就来教会你!

V-xin:ruyuan0330 获得600页原创精品文章汇总PDF 目录 一、前情提示二、清晰划分系统边界三、引入消息中间件解耦四、利用消息中间件削峰填谷五、手动流量开关配合数据库运维六、支持多系统同时订阅数据七、系统解耦后的感受八、下集预告 一、前情提示 上一篇文章…

吊炸天的云原生,到底是个啥

云原生技术里有很多技术、概念和术语,不了解的人,往往弄不清楚而一头雾水,这些概念都是啥,之间是什么关系?本文要说的就是这些。本文更多是科普和扫盲,无意面面俱到,也无意深入细节。 本文适合一…

Allegro如何合并同名网络铜皮操作指导

Allegro如何合并同名网络铜皮操作指导 Allegro可以将同名网络的铜皮合并起来,如下图,需要把下面两块铜皮合并成一块铜皮 具体操作如下 选择Shape选择merge shapes

剑指Offer-面试题1:整数除法——你真的会用Math.abs吗?

整数除法 题目要求 输入2个int型整数,它们进行除法计算并返回商,要求不得使用乘号*、除号/及求余符号%。当发生溢出时,返回最大的整数值。假设除数不为0。例如,输入15和2,输出15/2的结果,即7。 有问题的…

使用OpenCV的函数polylines()绘制多条相连的线段和多边形;使用函数fillPoly()绘制带填充效果的多边形

函数polylines()可用来根据点集绘制多条相连的线段,也可用来绘制多边形。 函数polylines()有两种原型,这里只向大家介绍比较常用的那种原型。 函数polylines()的C原型如下: void cv::polylines(InputOutputArray img,const Point *const *…

Power BI 11个必学官方示例数据案例(附下载链接)

在开始学习Power BI时,最大的问题就是不知道哪里找数据,或者有数据却对搭建看板毫无头绪, 不知道该从哪里下手。 本文收集整理了官网上最值得学习的11个案例,包括不同行业和分析方法,方便大家按需学习。点击标题即可转…

安徽省建设工程监理人员从业水平能力证书

安徽省建设监理协会会员单位从业人员是指已通过安徽省建设监理协会组织的从业水平能力认定考试,取得《安徽省建设工程监理人员从业水平能力证书》,并在工程建设中从事监理工作的监理工程师和监理员(以下简称“监理工程师、监理员”&#xff0…

LLVM中矩阵Matrix的实现分析

1 背景说明 Clang提供了C/C语言对矩阵的扩展支持,以方便用户使用可变大小的二维数据类型来实现计算,目前该特性还是实验版,设计和实现都在变化中。LLVM目前设计为支持小型列矩阵(column major),其对矩阵的…