linux汇编伪指令大全,RM汇编的伪指令(二)

2)ARM杂项伪指令

1.ADR伪指令:小范围的地址读取伪指令。

ADR指令将基于PC相对偏移的地址值读取到寄存器中。在汇编编译源程序时,ADR伪指令被编译器替换成一条合适的指令。通常编译器用一条ADD指令或SUB指令来实现该ADR伪指令的功能。

指令格式:ADR{cond} register ,expr

Register加载的寄存器

Expr程序相对偏移或寄存器相对偏移的表达式

非字对齐地址在-255~255字节范围内;

字对齐地址在-1020~1020字节范围内。

举例:

Start   MOV  R1,#10

ADR   R4,start   ;相当于PC-10后赋值给R4

2.ADRL指令:中等范围的地址读取伪指令。

ADRL指令将基于PC相对偏移的地址值或基于相对偏移的地址值读取到寄存器中,比ADR伪指令可读取更大范围的地址。在汇编编译源程序时,ADRL伪指令被编译器替换成两条合适的指令。若不能用两条指令实现ADRL伪指令功能,则产生错误,编译失败。

指令格式与ADR相同

非字对齐地址在64K字节范围内;

字对齐地址在256K字节范围内。

举例:

Start   MOV  R1,#10

ADR   R4,start+6000   ;=>ADD R4,PC,#0xe800    ADD R4,R4,#0x254

3.LDR指令  大范围的地址读取伪指令

LDR伪指令用于加载32位的立即数或一个地址值到指定寄存器。

在汇编编译源程序时,LDR指令被编译器替换成一条合适的指令,若加载的常数未超出MOV或MVN的范围,则使用MOV或MVN指令代替该LDR伪指令,否则汇编器将常量放入字池(内存),并使用一条程序相对偏移的LDR指令从文字池读出常量。

指令格式:LDR {cond} register , = expr/label_expr

Expr32位立即数

Label_expr基于PC的地址表达式或外部表达式

举例

LDR   R0,=0x123987;加载32位立即数

LDR   R0,=DATA_BUF+60;加载DATA_BUF地址+60

4.NOP指令

NOP指令产生所需的ARM无操作代码。可以使用指令MOV R0,R0。NOP不能有条件使用。执行和不执行无操作指令是一样的,因而不需要有条件执行。ALU状态不受NOP影响。

3)符号定义( Symbol Definit年ion)伪指令

符号定义伪指令用于定义ARM汇编程序中的变量、对变量赋值以及定义寄存器的别名等操作。

常见的符号定义伪指令有如下几种:

Ø用于定义全局变量的GBLA、GBLL和GBLS

Ø用于定义局部变量的LCLA、LCLL和LCLS

Ø用于对变量赋值的SETA、SETL、SETS

Ø为通用寄存器列表定义名称的RLIST

1.GBLA、GBLL和GBLS

语法格式:

GBLA(GBLL或GBLS)全局变量名

GBLA、GBLL和GBLS伪指令用于定义一个ARM程序中的全局变量,并将其初始化。其中:

GBLA伪指令用于定义一个全局的数字变量,并初始化为0;

GBLL伪指令用于定义一个全局的逻辑变量,并初始化为F(假);

GBLS伪指令用于定义一个全局的字符串变量,并初始化为空;

由于以上三条伪指令用于定义全局变量,因此在整个程序范围内变量名必须唯一。

使用示例:

GBLA Test1;定义一个全局的数字变量,变量名为Test1

Test1 SETA 0xaa;将该变量赋值为0xaa

GBLL Test2;定义一个全局的逻辑变量,变量名为Test2

Test2 SETL {TRUE};将该变量赋值为真

GBLS Test3;定义一个全局的字符串变量,变量名为Test3

Test3 SETS “ Testing ”;将该变量赋值为“ Testing ”

2.LCLA、LCLL和LCLS

语法格式:

LCLA(LCLL或LCLS)局部变量名

LCLA、LCLL和LCLS伪指令用于定义一个ARM程序中的局部变量,并将其初始化。其中:

LCLA伪指令用于定义一个局部的数字变量,并初始化为0;

LCLL伪指令用于定义一个局部的逻辑变量,并初始化为F(假);

LCLS伪指令用于定义一个局部的字符串变量,并初始化为空;

以上三条伪指令用于声明局部变量,在其作用范围内变量名必须唯一。

使用示例:

LCLA Test4;声明一个局部的数字变量,变量名为Test4

Test3 SETA 0xaa;将该变量赋值为0xaa

LCLL Test5;声明一个局部的逻辑变量,变量名为Test5

Test4 SETL {TRUE};将该变量赋值为真

LCLS Test6;定义一个局部的字符串变量,变量名为Test6

Test6 SETS “ Testing ”;将该变量赋值为“ Testing ”

3.SETA、SETL和SETS

语法格式:

变量名SETA(SETL或SETS)表达式

伪指令SETA、SETL、SETS用于给一个已经定义的全局变量或局部变量赋值。

SETA伪指令用于给一个数学变量赋值;

SETL伪指令用于给一个逻辑变量赋值;

SETS伪指令用于给一个字符串变量赋值;

其中,变量名为已经定义过的全局变量或局部变量,表达式为将要赋给变量的值。

使用示例:

LCLA Test3;声明一个局部的数字变量,变量名为Test3

Test3 SETA 0xaa;将该变量赋值为0xaa

LCLL Test4;声明一个局部的逻辑变量,变量名为Test4

Test4 SETL {TRUE};将该变量赋值为真

4.RLIST

语法格式:

名称RLIST {寄存器列表}

RLIST伪指令可用于对一个通用寄存器列表定义名称,使用该伪指令定义的名称可在ARM指令LDM/STM中使用。在LDM/STM指令中,列表中的寄存器访问次序为根据寄存器的编号由低到高,而与列表中的寄存器排列次序无关。

使用示例:

RegList RLIST {R0-R5,R8,R10};将寄存器列表名称定义为RegList,可在ARM指令LDM/STM中通过该名称访问寄存器列表。

4)数据定义(Data Definition)伪指令

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

常见的数据定义伪指令有如下几种:

— DCB用于分配一片连续的字节存储单元并用指定的数据初始化。

— DCW(DCWU)用于分配一片连续的半字存储单元并用指定的数据初始化。

— DCD(DCDU)用于分配一片连续的字存储单元并用指定的数据初始化。

— DCFD(DCFDU)用于为双精度的浮点数分配一片连续的字存储单元并用指定的数据初始化。

— DCFS  DCFSU)用于为单精度的浮点数分配一片连续的字存储单元并用指定的数据初始化。

— DCQ  DCQU)用于分配一片以8字节为单位的连续的存储单元并用指定的数据初始化。

— SPACE用于分配一片连续的存储单元

— MAP用于定义一个结构化的内存表首地址

— FIELD用于定义一个结构化的内存表的数据域

1.DCB

语法格式:

标号DCB表达式

DCB伪指令用于分配一片连续的字节存储单元并用伪指令中指定的表达式初始化。其中,表达式可以为0~255的数字或字符串。DCB也可用“ = ”代替。

使用示例:

Str DCB “ This is a test!”;分配一片连续的字节存储单元并初始化。

2.DCW(或DCWU)

语法格式:

标号DCW(或DCWU)表达式

DCW(或DCWU)伪指令用于分配一片连续的半字存储单元并用伪指令中指定的表达式初始化。

其中,表达式可以为程序标号或数字表达式。

用DCW分配的字存储单元是半字对齐的,而用DCWU分配的字存储单元并不严格半字对齐。

使用示例:

DataTest DCW 1,2,3;分配一片连续的半字存储单元并初始化。

3.DCD(或DCDU)

语法格式:

标号DCD(或DCDU)表达式

DCD(或DCDU)伪指令用于分配一片连续的字存储单元并用伪指令中指定的表达式初始化。其中,表达式可以为程序标号或数字表达式。DCD也可用“ & ”代替。

用DCD分配的字存储单元是字对齐的,而用DCDU分配的字存储单元并不严格字对齐。

使用示例:

DataTest DCD 4,5,6;分配一片连续的字存储单元并初始化。

4.DCFD(或DCFDU)

语法格式:

标号DCFD(或DCFDU)表达式

DCFD(或DCFDU)伪指令用于为双精度的浮点数分配一片连续的字存储单元并用伪指令中指定的表达式初始化。每个双精度的浮点数占据两个字单元。用DCFD分配的字存储单元是字对齐的,而用DCFDU分配的字存储单元并不严格字对齐。

使用示例:

FDataTest DCFD 2E115,-5E7;分配一片连续的字存储单元并初始化为指定的双精度数。

5.DCFS(或DCFSU)

语法格式:

标号DCFS(或DCFSU)表达式

DCFS(或DCFSU)伪指令用于为单精度的浮点数分配一片连续的字存储单元并用伪指令中指定的表达式初始化。每个单精度的浮点数占据一个字单元。用DCFS分配的字存储单元是字对齐的,而用DCFSU分配的字存储单元并不严格字对齐。

使用示例:

FDataTest DCFS 2E5,-5E-7;分配一片连续的字存储单元并初始化为指定的单精度数。

6.DCQ(或DCQU)

语法格式:

标号DCQ(或DCQU)表达式

DCQ(或DCQU)伪指令用于分配一片以8个字节为单位的连续存储区域并用伪指令中指定的表达式初始化。

用DCQ分配的存储单元是字对齐的,而用DCQU分配的存储单元并不严格字齐

使用示例:

DataTest DCQ 100;分配一片连续的存储单元并初始化为指定的值。

7.SPACE

语法格式:

标号SPACE表达式

SPACE伪指令用于分配一片连续的存储区域并初始化为0。其中,表达式为要分配的字节数。

SPACE也可用“%”代替。

使用示例:

DataSpace SPACE 100;分配连续100字节的存储单元并初始化为0。

8.MAP

语法格式:

MAP表达式{,基址寄存器}

MAP伪指令用于定义一个结构化的内存表的首地址。MAP也可用“^”代替。

表达式可以为程序中的标号或数学表达式,基址寄存器为可选项,当基址寄存器选项不存在时,表达式的值即为内存表的首地址,当该选项存在时,内存表的首地址为表达式的值与基址寄存器的和。

MAP伪指令通常与FIELD伪指令配合使用来定义结构化的内存表。

使用示例:

MAP 0x100,R0;定义结构化内存表首地址的值为0x100+R0。

9.FILED

语法格式:

标号FIELD表达式

FIELD伪指令用于定义一个结构化内存表中的数据域。FILED也可用“ # ”代替。

表达式的值为当前数据域在内存表中所占的字节数。

FIELD伪指令常与MAP伪指令配合使用来定义结构化的内存表。MAP伪指令定义内存表的首地址,FIELD伪指令定义内存表中的各个数据域,并可以为每个数据域指定一个标号供其他的指令引用。

注意MAP和FIELD伪指令仅用于定义数据结构,并不实际分配存储单元。

使用示例:

MAP 0x100;定义结构化内存表首地址的值为0x100。

A FIELD 16;定义A的长度为16字节,位置为0x100

B FIELD 32;定义B的长度为32字节,位置为0x110

S FIELD 256;定义S的长度为256字节,位置为0x130

5)汇编控制(Assembly Control)伪指令

汇编控制伪指令用于控制汇编程序的执行流程,常用的汇编控制伪指令包括以下几条:

— IF、ELSE、ENDIF

— WHILE、WEND

— MACRO、MEND

— MEXIT

1.IF、ELSE、ENDIF

语法格式:

IF逻辑表达式

指令序列1

ELSE

指令序列2

ENDIF

IF、ELSE、ENDIF伪指令能根据条件的成立与否决定是否执行某个指令序列。当IF后面的逻辑表达式为真,则执行指令序列1,否则执行指令序列2。其中,ELSE及指令序列2可以没有,此时,当IF后面的逻辑表达式为真,则执行指令序列1,否则继续执行后面的指令。

IF、ELSE、ENDIF伪指令可以嵌套使用。

使用示例:

GBLL Test;声明一个全局的逻辑变量,变量名为Test……

IF Test = TRUE

指令序列1

ELSE

指令序列2

ENDIF

2.WHILE、WEND

语法格式:

WHILE逻辑表达式

指令序列

WEND

WHILE、WEND伪指令能根据条件的成立与否决定是否循环执行某个指令序列。当WHILE后面的逻辑表达式为真,则执行指令序列,该指令序列执行完毕后,再判断逻辑表达式的值,若为真则继续执行,一直到逻辑表达式的值为假。

WHILE、WEND伪指令可以嵌套使用。

使用示例:

GBLA Counter;声明一个全局的数学变量,变量名为Counter

Counter SETA 3;由变量Counter控制循环次数

……

WHILE Counter

指令序列

WEND

3.MACRO、MEND

语法格式:

MACRO

$标号宏名$参数1,$参数2,……

指令序列

MEND

MACRO、MEND伪指令可以将一段代码定义为一个整体,称为宏指令,然后就可以在程序中通过宏指令多次调用该段代码。其中,$标号在宏指令被展开时,标号会被替换为用户定义的符号,宏指令可以使用一个或多个参数,当宏指令被展开时,这些参数被相应的值替换。

宏指令的使用方式和功能与子程序有些相似,子程序可以提供模块化的程序设计、节省存储空间并提高运行速度。但在使用子程序结构时需要保护现场,从而增加了系统的开销,因此,在代码较短且需要传递的参数较多时,可以使用宏指令代替子程序。

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

MACRO、MEND伪指令可以嵌套使用。

4.MEXIT

语法格式:

MEXIT

MEXIT用于从宏定义中跳转出去。

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

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

相关文章

python贴吧顶贴_Python实现百度贴吧自动顶贴机

开发这款小工具,我们需要做一些准备: url.txt:多个需要顶起的帖子地址。 reply:多条随机回复的内容。 selenium:浏览器自动化测试框架 首先,我们先使用pip完成selenium的安装。 示例代码: pip i…

腾讯云成为国内首家FinOps基金会顶级会员

11月24日,腾讯云正式宣布加入FinOps基金会,作为国内首家FinOps基金会顶级会员,腾讯云将联合FinOps基金会,全面推进对FinOps标准和最佳实践的贡献,为企业提供云财务管理的最佳解决方案。 “作为中国云原生技术和应用的领…

雷锋网独家解读:阿里云原生应用的布局与策略

简介: 阿里云一直希望可以做标准化的技术,跟社区的标准、行业的标准进行打通,这样对于阿里云的客户而言,简化了很多流程,其具备的能力也是未来的主流。 文章来源:雷锋网 作者:杨丽 原标题&am…

python map zip_Python学习笔记(九) map、zip和filter函数

这篇文章主要介绍 Python 中几个常用的内置函数,用好这几个函数可以让自己的代码更加 Pythonnic 哦1、mapmap() 将函数 func 作用于序列 seq 的每一个元素,并返回处理后的结果,其语法格式如下:map(func, seq)其中,func…

日本字全角字符linux,Linux命令行输入全角字符被转化

产品经理在jira里报了个ticket,说文章里有链接404了。另外非常积极主动的说,应该是没填“http://“协议头。哎,好好提你的bug,把解决bug的事情留给专业人士来不行么。人与人之间的沟通有时候就是要逞一下能,显得”我“…

分久必合的Lindorm传奇

简介: 2009年,阿里巴巴首先提出用分布式架构替代传统商业数据库,成功用自主开源的AliSQL支撑双11数据洪流;2016年,为应对超大规模业务场景,阿里云开始自研分布式数据库。十余年间,阿里巴巴数据库…

python做物联网控制_python实现NB-IoT模块远程控制

本来想尝试下如果不使用运营商网络应用平台情况下,只是在服务商服务器上是否可以实现对终端完全控制,如果这样可行,那么物联网应用服务端更有灵活性。实际情况下,很难实现和运营商网络对等的处理,用python代码原型确实…

低代码发展专访系列之一:低代码平台产品的使用者都是谁?

2019年开始,低代码爆火。有人认为它是第四代编程语言,有人认为它是开发模式的颠覆,也有人认为是企业管理模式的变革……有很多声音,社区讨论很热烈。CSDN随后展开低代码平台产品系列活动,包括低代码开发者认知度与应用…

进击的云原生,为开发者提供更多可能性

简介: 云原生为开发者提供了三方面便利:应用基础设施“零”维护、应用架构现代化“零”阻力、数字与物理世界“零”边界。 作者|易立 阿里云容器服务负责人 背景 ​ 云原生是云计算发展的必然产物,而云原生的持续生长也绝非偶然…

linux 分割pdf,PDFBox分割PDF文档

在前一章中,我们已经看到了如何将JavaScript添加到PDF文档。 现在来学习如何将给定的PDF文档分成多个文档。分割PDF文档中的页面可以使用Splitter类将给定的PDF文档分割为多个PDF文档。 该类用于将给定的PDF文档分成几个其他文档。以下是拆分现有PDF文档的步骤第1步…

python3 读取文本文件_python3读取文件最简单的办法

原博文 2020-06-11 09:14 −file open(test.txt) #读文件 s file.read() #把文件放到字符串里面 print(s) #输出字符串 ... 相关推荐 2019-12-09 20:32 − [TOC] # 1. 模块 ## 1.1 模块是什么? - 模块就是个 *Python* 文件 - 一个模块就是一个包含 *Python* 代码…

常用的几款工具让 Kubernetes 集群上的工作更容易

作者 | Addo Zhang来源 | 云原生指北其实日常工作中在集群上的操作也非常多,今天就来介绍我所使用的工具。kubectl-alias使用频率最高的工具,我自己稍微修改了一下,加入了 StatefulSet 的支持。这个是我的 https://github.com/addozhang/kube…

以太坊白皮书_以太坊发展历程

2013年年末,以太坊创始人Vitalik Buterin发布了以太坊初版白皮书,在全球的密码学货币社区陆续召集到一批认可以太坊理念的开发者,启动了项目。2014年2月,Vitalik在迈阿密比特币会议上第一次公布了以太坊项目,核心开发团…

来电科技:基于 Flink + Hologres 的实时数仓演进之路

简介: 本文将会讲述共享充电宝开创企业来电科技如何基于 Flink Hologres 构建统一数据服务加速的实时数仓 作者:陈健新,来电科技数据仓库开发工程师,目前专注于负责来电科技大数据平台离线和实时架构的整合。 深圳来电科技有限…

linux find 图片,linuxfind命令的介绍【图解】

作为一种分时的特数操作系统,Linux具备Windows和mac OS与众不同的操作界面和用户体验,虽然它并不是最主流的操作系统,但是它会作为操作系统而得到众多程序开发人员的青睐和熟知。find命令是操作系统环境下进行计算机功能调用的特殊命令&#…

matlab中patch命令_matlab中patch函数的用法——emily

patch创建补片图形对象句法:patch(X,Y,C)patch(X,Y,Z,C)patch(FV)patch(...PropertyName,propertyvalue...)patch(PropertyName,propertyvalue,...)handle patch(...)描述:patch是个底层的图形函数,用来创建补片图形对象。一个补片对象是由其…

移动云TeaTalk:这是一场云数据库技术的深度对话!

随着云计算的发展,数据库上云已经成为趋势,云数据库服务相对于传统数据库在架构、性能与安全等方面都存在着新的挑战。11月23日,移动云TeaTalk线上直播活动成功举办。本次活动以“云数据库技术创新研究与实践”为主题,邀请了移动云…

devc++源文件未编译_iOS 编译知识小结

简介源码到可执行文件流程编译器 编译流程预处理(preprocessor)词法分析(lexical anaysis)语法分析(semantic analysis)CodeGen生成汇编代码生成目标文件生成可执行文件Xcode中查看Clang编译.m文件信息 Xcode常见编译报错分析1. duplicate symbols报错2. symbol(s) not found f…

微信不再提供小程序打开App?借助H5为App引流的方式你必须知道!

简介: 2021年5月14日App开发者领域发布了一条重要消息:微信开放平台为了提升用户体验,将于2021年5月20日(后来延期到2021年5月27日)起不再提供“小程序打开App技术服务”,现在能够实现从微信打开App的方式只…

linux函数进程撤销,Linux进程控制函数

1. fork()#include#includepid_t fork(void);一个进程可以调用fork函数创建一个新进程,由fork创建的进程被称为子进程,子进程是父进程的副本,它将获得父进程的数据空间,队,栈等资源副本pid_t 是一个宏定义,…