什么叫伪指令?伪指令与指令有什么区别
伪指令是在编译阶段发挥作用的,由汇编器(MASM、TASM等)来解释。
一、含义不同:
伪指令告诉汇编程序进行什么操作,仅仅在汇编时有效,比如变量的定义,内存空间的分配,指令是机器运行对应机器的一个动作,只有汇编通过,机器才能运行。指令是在执行阶段发挥作用的,由CPU(Intel、AMD等)来执行。
二、作用不同:
单片机中指令是对应CPU的可执行代码,在编译时会分配存储单元,运行时CPU按指令指引的方向和功能执行。伪指令是不可执行代码,一般起辅助作用,是为编译系统服务的,编译时不会分配存储单元,只是按伪指令的功能定位程序数据或指令位置。
51单片机最常用的伪指令如下:
(1)起始(Origin)伪指令
标号:ORG nn
功能: 定义程序或数据块的起始地址。 指示此语句后面的程序或数据块以nn为起始地址连续存放在程序存储器中。
例如:
ORG 2000H
MOV A,20H
ORG 伪指令规定了程序的起始地址从 2000H 开始,即该程序的第一条指令“MOVA,20H”从地址 2000H 开始存放。)
以上内容参考:百度百科-伪指令
什么是伪指令?常用的伪指令功能有哪些
用于告诉汇编程序如何进行汇编的指令,它既不控制机器的操作也不被汇编成机器代码,只能为汇编程序所识别并指导汇编如何进行。
ADRL
伪指令
将相对于程序或相对于寄存器的地址载入寄存器中。
与
ADR
指令相似。ADRL
所加载的地址比
ADR
所加载的地址更宽,因为它可生成两个数据处理指令。
Note
汇编版本老于
ARMv6T2
的处理器的
Thumb
指令时,ADRL
是无效的。
语法
ADRL{cond}
Rd,label
其中:
cond
是一个可选的条件代码(请参阅条件执行)。
Rd
是要加载的寄存器。
label
表达式,与程序或寄存器相关。
有关详细信息,请参阅相对寄存器和程序相对的表达式。
用法
ADRL
始终汇编为两个
32
位指令。
即使使用单个指令就可完成地址访问,也会生成多余的第二个地址。
如果汇编程序无法将地址构建为两个指令,则它将生成一条错误消息,汇编将失败。
有关加载更宽范围地址的信息,请参阅LDR
伪指令(另请参阅将常数加载到寄存器)。
ADRL
可生成与位置无关的代码,因为地址与程序或寄存器有关。
如果
label
与程序有关,则其表示的地址必须要与
ADRL
伪指令在同一汇编程序区域内,请参阅AREA。
如果使用
ADRL
来为
BX
或
BLX
指令生成目标,则当目标中包含
Thumb
指令时,您就要自己设置地址的
Thumb
位(位
0)。
体系结构和范围
可用范围取决于所用的指令集:
ARM
±64KB
到字节或半字对齐的地址。
±256KB
字节,字对齐地址。
32
位
Thumb
±1MB
字节,字节、半字或字对齐地址。
16
位
Thumb
ADRL
不可用。
上面给出的范围是相对于位于当前指令后的、离当前指令有四个字节(在
Thumb
代码中)或两个字(在
ARM
代码中)间隔的点而言的。
在
ARM
和
32
位
Thumb
中,如果地址为
16
字节对齐,或与该点的相对性更高,则相对地址的范围可更大。
MOV32
伪指令
将以下项之一加载到寄存器:
一个
32
位常数值
任何地址。
MOV32
始终会生成两个
32
位指令,即一个
MOV、MOVT
对。
您可利用它加载任何
32
位常数或访问整个地址空间。
如果用
MOV32
加载地址,则所生成的代码将与位置有关。
语法
MOV32{cond}
Rd,
expr
其中:
cond
是一个可选的条件代码(请参阅条件执行)。
Rd
是要加载数据的寄存器。Rd
不可为
sp
或
pc。
expr
可以是下列项之一:
symbol
程序区域中的标签。
constant
任何
32
位常数。
symbol
+
constant
标签加上
32
位常数。
用法
MOV32
伪指令的主要功能有:
当单个指令中无法生成立即数时,生成文字常数。
将相对于程序的地址或外部地址载入寄存器中。
无论链接器将包含
MOV32
的
ELF
代码段置于何处,该地址始终有效。
Note
以这种方式加载的地址是在链接时确定的,因此代码不是位置无关的。
如果所引用的标签位于
Thumb
代码中,则
MOV32
将会设置该地址的
Thumb
位(位
0)。
体系结构
此伪指令在
ARMv6T2
和
ARMv7
中的
ARM
和
Thumb
状态下均有效。
LDR
伪指令
将以下项之一载入寄存器:
一个
32
位常数值
一个地址。
Note
本节仅介绍
LDR
伪
指令。
有关
LDR
指令
的详细信息,请参阅
内存访问指令。
有关使用
LDR
伪指令加载常数的信息,请参阅用
LDR
Rd,
=const
加载。
语法
LDR{cond}{.w}
Rt,=[expr
|
label‑expr]
其中:
cond
是一个可选的条件代码(请参阅条件执行)。
.W
是可选的指令宽度说明符。
Rt
是要加载的寄存器。