⑴ 使用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更为灵活。
用于告诉汇编程序如何进行汇编的指令,它既不控制机器的操作也不被汇编成机器代码,只能为汇编程序所识别并指导汇编如何进行。 将相对于程序或相对于寄存器的地址载入寄存器中。 与 ADR 指令相似。ADRL 所加载的地址比 ADR 所加载的地址更宽,因为它可生成两个数据处理指令。
⑶ 汇编语言 ENTRY 是什么指令
在ARM汇编中,ENTRY 是一个伪指令,用于指定汇编程序的入口点。在一个较大型的完整的汇编程序(多个源文件组成的工程)中至少要有一个ENTRY(也可以有多个,当有多个ENTRY时,程序的真正入口点由链接器指定),但在某一个源文件里最多只能有一个ENTRY(可以没有)。
⑷ ARM汇编语言由哪些指令组成它们之间的区别是什么
机器指令能被处理器直接执行,而汇编指令、伪指令和宏指令不能。机器指令包括ARM指令集和Thumb指令集 。
伪指令是在源程序汇编期间,由汇编编译器处理。其作用是为汇编程序完成准备工作。
宏指令在程序中用于调用宏,宏是一段独立的程序代码;在程序汇编时,对宏调用进行展开,用宏体代替宏指令。