导航:首页 > 编程语言 > arm汇编程序伪指令的作用

arm汇编程序伪指令的作用

发布时间:2024-12-26 05:00:46

⑴ 使用ARM汇编伪指令编程:分别将两个无符号数放在寄存器R0和R1中,求其中较大的那个数的阶乘

你好,这里的回答应当与ARM相似下面我做一个简单的ARM汇编语言描述

ARM中伪指令不是真正的ARM指令或者Thumb指令,这些伪指令在汇编编译时对源程序进行汇编处理时被替换成对应的ARM或Thumb指令(序列)。ARM伪指令包括ADR、ADRL、LDR和NOP等。
1、ADR(小范围的地址读取伪指令)
该指令将基于PC的地址值或基于寄存器的地址值读取到寄存器中。
语法格式
ADR{cond} register, expr
其中,cond为可选的指令执行的条件
register为目标寄存器
expr为基于PC或者基于寄存器的地址表达式,其取值范围如下:
当地址值不是字对齐时,其取值范围为-255~255.
当地址值是字对齐时,其取值范围为-1020~1020
当地址值是16字节对齐时,其取值范围将更大
在汇编编译器处理源程序时,ADR伪指令被编译器替换成一条合适的指令。通常,编译器用一条ADD指令或SUB指令来实现该ADR伪指令的功能。
因为ADR伪指令中的地址是基于PC或者基于寄存器的,所以ADR读取到的地址为位置无关的地址。当ADR伪指令中的地址是基于PC时,该地址与ADR伪指令必须在同一个代码段中。
示例
start MOV r0,#10 ;因为PC值为当前指令地址值加8字节
ADR r4, start ;本ADR伪指令将被编译器替换成SUB r4,pc,#0xc
2、 ADRL(中等范围的地址读取伪指令)
该指令将基于PC或基于寄存器的地址值读取到寄存器中。ADRL伪指令比ADR伪指令可以读取更大范围的地址。ADRL伪指令在汇编时被编译器替换成两条指令,即使一条指令可以完成该伪指令的功能。
语法格式
ADRL{cond} register,expr
示例
start MOV r0,#10 ;因为PC值为当前指令地址值加8字节
ADRL r4,start+60000 ;本ADRL伪指令将被编译器替换成下面两条指令
ADD r4,pc,#0xe800
ADD r4,r4,#0x254
3、LDR(大范围的地址读取伪指令)
LDR伪指令将一个32位的常数或者一个地址值读取到寄存器中
语法格式
LDR{cond} register, =[expr|label-expr]
其中,expr为32位的常量。编译器将根据expr的取值情况,如下处理LDR伪指令:
当expr表示的地址值没有超过MOV或MVN指令中地址的取值范围时,编译器用合适的MOV或MVN指令代替该LDR伪指令
当expr表示的地址值超过了MOV或者MVN指令中地址的取值范围时,编译器将该常数放在数据缓冲区中,同时用一条基于PC的LDR指令读取该常数。
label-expr为基于PC的地址表达式或者是外部表达式。当label-expr为基于PC的地址表达式时,编译器将label-expr表示的数值放在数据缓冲区(literal pool)中,然后将该LDR伪指令处理成一条基于PC到该数据缓冲区单元的LDR指令,从而将该地址值读取到寄存器中。这时,要求该数据缓冲区单元到PC的距离小于4KB。当label-expr为外部表达式,或者非当前段的表达式时,汇编编译器将在目标文件中插入一个地址重定位伪操作,这样连接器将在连接时生成该地址。
LDR伪指令主要有以下两种用途:
当需要读取到寄存器中的数据超过了MOV及MVN指令可以操作的范围时,可以使用LDR伪指令将该数据读取到寄存器中。
将一个基于PC的地址值或者外部的地址值读取到寄存器中。由于这种地址值是在连接时确定的,所以这种代码不是位置无关的。同时LDR伪指令的PC值到数据缓冲区中的目标数据所在的地址的偏移量要小于4KB。
示例
将0xff0读取到R1中
LDR R1,=0xFF0
汇编后将得到:
MOV R1,0xFF0
将0xfff读取到R1中
LDR R1,=0xFFF
汇编后将得到:
LDR R1,[PC,OFFSET_TO_LPOOL]

LPOOL DCD 0xFFF
将外部地址ADDR1读取到R1中
LDR R1,=ADDR1
汇编后将得到:
LDR R1,[PC,OFFSET_TO_LPOOL]

LPOOL DCD ADDR1
4、NOP空操作伪指令
在汇编时将被替换成ARM中的空操作,如MOV R0,R0
NOP伪指令不影响CPSR中的条件标志位
以上是对ARM汇编语言的回答描述,望采纳。谢谢

⑵ 伪指令MOV32 伪指令

伪指令MOV32和LDR在ARM处理器中用于数据加载操作,它们的用途和使用方法有所不同,本文将详细解释两者之间的区别。


伪指令MOV32主要功能是加载32位常数或访问整个地址空间。其语法为:MOV32 Rd, expr。其中,cond为可选的条件代码(请参阅条件执行),Rd是要加载数据的寄存器(Rd不可为sp或pc),expr可以是符号、常数或符号加上常数。使用MOV32加载地址时,生成的代码将与位置有关,且以这种方式加载的地址是在链接时确定的,因此代码不是位置无关的。


伪指令LDR用于将常数或地址载入寄存器。其语法为:LDR{.w} Rt,=[expr | label-expr]。其中,cond为可选的条件代码(请参阅条件执行),.W为可选的指令宽度说明符,Rt是要加载的寄存器。expr的值可以是一个数值常数,如果值位于范围内则生成一个MOV或MVN指令,否则生成一个相对于程序的LDR指令;label-expr可以是一个与程序相关的表达式或外部表达式,汇编程序将值放入文字池中,并生成与程序相关的LDR指令。


伪指令LDR的主要功能包括当立即数超出MOV和MVN指令范围时生成文字常数,将相对于程序的地址或外部地址载入寄存器中,无论链接器将包含LDR的ELF代码段置于何处,该地址始终有效。以这种方式加载的地址是在链接时确定的,因此代码不是位置无关的。


伪指令MOV32和LDR在ARMv6T2和ARMv7中都有效,但它们在Thumb状态下的行为有所不同。在Thumb状态下,LDR指令可以在32位和16位宽度下使用,但MOV32指令仅在ARM状态下可用。


在实际编程中,选择使用MOV32还是LDR取决于需要加载的数据类型和位置。如果需要加载32位常数或需要访问整个地址空间,则使用MOV32更为合适;如果需要加载常数或地址,且数据大小不确定时,则使用LDR更为灵活。


(2)arm汇编程序伪指令的作用扩展阅读

用于告诉汇编程序如何进行汇编的指令,它既不控制机器的操作也不被汇编成机器代码,只能为汇编程序所识别并指导汇编如何进行。 将相对于程序或相对于寄存器的地址载入寄存器中。 与 ADR 指令相似。ADRL 所加载的地址比 ADR 所加载的地址更宽,因为它可生成两个数据处理指令。

⑶ 汇编语言 ENTRY 是什么指令

在ARM汇编中,ENTRY 是一个伪指令,用于指定汇编程序的入口点。在一个较大型的完整的汇编程序(多个源文件组成的工程)中至少要有一个ENTRY(也可以有多个,当有多个ENTRY时,程序的真正入口点由链接器指定),但在某一个源文件里最多只能有一个ENTRY(可以没有)。

⑷ ARM汇编语言由哪些指令组成它们之间的区别是什么

机器指令能被处理器直接执行,而汇编指令、伪指令和宏指令不能。机器指令包括ARM指令集和Thumb指令集 。

伪指令是在源程序汇编期间,由汇编编译器处理。其作用是为汇编程序完成准备工作。

宏指令在程序中用于调用宏,宏是一段独立的程序代码;在程序汇编时,对宏调用进行展开,用宏体代替宏指令。

阅读全文

与arm汇编程序伪指令的作用相关的资料

热点内容
搭梯子用什么云服务器 浏览:544
光度学pdf 浏览:287
加密通讯器控制单元 浏览:150
vscode写python不提示代码 浏览:17
8051单片机汇编 浏览:868
把文件夹放进回收站就删除了嘛 浏览:353
文件夹是一种什么软件 浏览:213
pdf崩溃 浏览:872
小学手算法视频 浏览:965
预编译和第一遍编译 浏览:773
微信怎么样去除加密 浏览:574
php读取文档内容 浏览:631
亚马逊云的虚拟云服务器的产品 浏览:895
打开php网站空白 浏览:167
phpxml读取数据 浏览:338
如何安装微信安卓版 浏览:123
51单片机蓝牙传送到手机 浏览:72
使用hmcl压缩包用完不保存 浏览:269
php开启phpfpm 浏览:657
看pdf常亮 浏览:835