label伪指令,label命令

http://www.itjxue.com  2023-01-05 11:09  来源:未知  点击次数: 

汇编语言中的label伪指令是什么意思,怎么使用?

用法为:

buffer(变量) LABEL WORD(字类型)例如:Buffer1 LABEL WORD

Buffer2 DB 20 DUP (0)

通常,紧接着的下一条语句定义的类型与LABEL指定的类型不同。而实际上,Buffer1是Buffer2的别名,两者指向内存中的同一个存储地址。换言之,同一组数据定义了两种不同的类型,在接受不同数据类型的访问时,可以指定相应的标号。如接受一个字类型数据访问时,使用Buffer1;接受字节类型数据访问时,使用Buffer2。否则因为数据类型不匹配,编译器编译时将出现异常。

说到LABEL,也不得不提到另一个与之功能相近的伪指令THIS。THIS通常也与它的下一条变量定义语句相关,因为在数据类型过多的情况下接受不同数据类型访问时,使用PTR属性限定符显得十分繁琐,比如起初定义了变量:

Buffer1 EQU THIS WORD

Buffer2 DB 20 DUP (0)

假设有如下语句:

mov AX, Buffer1

mov AX, Buffer2

其中,在作字类型访问时,mov AX, Buffer1相当于mov AX, WORD PTR Buffer2,这样省去了繁琐的PTR操作符。

以上两条语句在内存中的安排:

LDR PC,[PC,#0]这个有什么意义,pc的值应该没有变吧,为什么视频里还要这么写呢?

1.将地址为pc+0的内存单元中的数据读取到pc中(用C语言的方式讲:即将pc指向的内存单元中的数据赋值给pc)。

2.这条汇编通常对应于如下伪指令:ldr pc,=label @跳转到label(标号)的链接地址处

举例:

ldr pc,=label

label:

...

⑴label前的=表示这是一条伪指令,否则就是内存访问指令。如果label对应的数值可以转换为立即数,汇编时通常翻译成mov pc,#label;否则会将label保存到某个内存单元,然后

ldr pc,[pc,#0]。

⑵链接地址,即链接时指令所在段的起始地址+指令相对于段起始地址的偏移量。注意与b,bl相对跳转的区别。

HMI中的LABEL什么意思

LABEL的功能是定义变量或标号的类型,而变量或标号的段属性和偏移属性由该语句所处的位置确定。

符号定义伪指令——LABEL伪指令

格式:变量/标号 LABEL 类型

变量的类型有:BYTE、WORD、DWORD、DQ、DT;

标号的类型有:NEAR、FAR;

例如:

Buffer1 LABEL WORD

Buffer2 DB 20 DUP (0)

通常,紧接着的下一条语句定义的类型与LABEL指定的类型不同。而实际上,Buffer1是Buffer2的别名,两者指向内存中的同一个存储地址。换言之,同一组数据定义了两种不同的类型,在接受不同数据类型的访问时,可以指定相应的标号。如接受一个字类型数据访问时,使用Buffer1;接受字节类型数据访问时,使用Buffer2。否则因为数据类型不匹配,编译器编译时将出现异常。

汇编语言中LABEL伪指令的功能?

这个指令很少用,完全可以用xxx ptr这种形式替代

比如

aa label word

bb dd 12345678h

那么mov ax, aa就是把bb这个标签最为word来访问,这就是你说的设置或更改标号的属性(也就是类型)

执行完这句后ax = 5678h

什么是伪指令?常用的伪指令功能有哪些

用于告诉汇编程序如何进行汇编的指令,它既不控制机器的操作也不被汇编成机器代码,只能为汇编程序所识别并指导汇编如何进行。 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 是要加载的寄存器。

伪指令label

LABEL可以使同一个变量具有不同的类型属性。其格式为:

变量名 LABEL 类型

or 标号  LABEL 类型

其中变量的数据类型可以是BYTE,WORD,DWORD,标号的代码类型可以是NEAR或FAR。

数据定义及存储器分配伪指令格式中的 "变量 "是操作数的符号地址,它是可有可无

的,它的作用与指令语句前的标号相同,区别是变量后面不加冒号。如果语句中有

变量,那么汇编程序将操作数的第一个字节的偏移地址赋于这个变量。

网上搜的,希望有用,我也刚接触汇编不久!

(责任编辑:IT教学网)

更多