在我这学期的系统软件课程中,我们正在学习汇编程序和其他系统软件。在阅读整个课程时,我遇到了LITERALS的主题。
文字和立即操作数之间的比较表明,它们之间的唯一区别是文字不被汇编为指令的一部分,而立即操作数则是。
如果我们可以使用立即数操作数,为什么我们必须使用文字?是什么让他们与众不同?换句话说,何时使用文字以及何时使用立即操作数?
立即操作数是可以编码到指令本身中的文字值,例如,
MOV R1, 17 ; move 17 as a value to R1
但是,您可能需要将文字值放入程序可能使用的数据结构或表中。 您可以使用声明存储的汇编器“psuedo-ops”来执行此操作:
DW 17 ; define a word containing the literal 17
一些文字,尤其是文本字符串,几乎永远不会适合立即字段(立即字段中没有足够的位),因此实际上不能作为指令立即值包含在程序中:
XYZ DC "I am a duck."
发生这种情况时,您通常会发现指令通过其标签将声明的数据引用为隐式立即值,而不是文字:
MOV R1, XYZ
一个例外是极短的字符串文字:
MOV R1, "A"
这与调用语句中的隐式文字没有什么不同:
CALL FOO
指 FOO 代码上的标签:
FOO: MOV R1, 17
RETURN
您的汇编器语法可能与此不同,但原理保持不变。
文字操作数 定义:文字操作数是存储在内存或文字池中特定位置的常量值。 用法:当常量值较大或直接操作数的大小有限制时,使用文字操作数,有助于有效管理大常量。 直接与间接:文字操作数是通过内存地址间接访问的。 大小和灵活性:文字操作数可以处理更大的值,并在某些体系结构中提供更大的灵活性。 指令示例:在 MOV AX、[LITERAL_ADDRESS] 等指令中,LITERAL_ADDRESS 指的是存储文字值的地址。 内存访问:使用文字操作数需要额外的内存访问来获取值。 性能:由于涉及内存访问,因此与使用立即数操作数相比,使用文字操作数可能会稍微慢一些。 立即数操作数 定义:立即数操作数是直接嵌入指令本身的常量值。 用法:当所需的值在写入指令时已知并固定时,使用立即操作数。 直接与间接:立即操作数是指令本身的一部分,不需要内存地址。 大小和灵活性:立即操作数受到指令格式的限制,例如可用于表示值的位数。 指令示例:在 MOV AX 等指令中,5, 5 是立即数操作数,意味着值 5 直接移入 AX 寄存器。 内存访问:不需要额外的内存访问,因为该值包含在指令中。 性能:立即操作数通常会导致执行速度更快,因为不需要额外的内存访问。