1

隐含:操作数在指令定义中隐含指定。例子:CLA, CME, INP.

它主要用于零地址(堆栈组织)和一地址(累加器组织)指令。

立即数:操作数在指令本身中指定,主要用于常量。示例:ADD R1,#3,MUL R1,R2,#7

但问题来了如何检查指令:

1)PUSH 3

2)LD 7

第一个是零地址指令(基于堆栈),第二个是累加器指令。在这两条指令中,操作数都在指令本身中定义。哪种寻址模式更受欢迎,或者最能描述它们?

如何检查指令是隐含的还是即时的?


x86 上隐式操作数的更多示例:SAHFLAHFCPUID.

来源:https ://en.wikipedia.org/wiki/CPUID

在汇编语言中,CPUID 指令不采用显式参数,因为 CPUID 隐式使用 EAX 寄存器(有时是 ECX)来确定在 EAX、EBX、ECX 和 EDX 中返回的信息。

来源:http ://www.felixcloutier.com/x86/LAHF.html

LAHF — Load Status Flags into AH Register
This instruction executes as described above in compatibility mode and legacy mode. It is valid in 64-bit mode only if CPUID.80000001H:ECX.LAHF-SAHF[bit 0] = 1.

来源:http ://www.felixcloutier.com/x86/SAHF.html

SAHF — Store AH into Flags
Loads the SF, ZF, AF, PF, and CF flags of the EFLAGS register with values from the corresponding bits in the AH register (bits 7, 6, 4, 2, and 0, respectively). Bits 1, 3, and 5 of register AH are ignored; the corresponding reserved bits (1, 3, and 5) in the EFLAGS register remain as shown in the “Operation” section below.

This instruction executes as described above in compatibility mode and legacy mode. It is valid in 64-bit mode only if CPUID.80000001H:ECX.LAHF-SAHF[bit 0] = 1.

使用示例:(来源:https ://www.slideshare.net/rbtaccess/flag-control )

MOV AH, 25H       ; immediate source operand
SAHF              ; implicit operands

更多示例包括CLCSTCCMC,它们分别清除、设置或翻转进位标志 CF。(CF 是 FLAGS 中的一个位,而不是整个寄存器。)

4

3 回答 3

5

像 PUSH 这样的指令有两个操作数:隐式目标和显式源。该显式源可以是寄存器、立即数或(在某些 ISA 上,如 x86),显式内存操作数,如push qword [rdi + rax*8].

隐式、寄存器、显式内存或立即数是操作数的属性,而不是整个指令的属性

您不能将整个指令标记为使用隐式或立即指令。对于一些简单的累加器 ISA,您可以只讨论源操作数是隐式还是立即数,但您的问题也显示了像 ARM 指令一样的立即数示例。

例如,可以说所有操作数属于同一类别的指令使用隐式操作数。例如x86的movsd指令有两个操作数,并且都是隐式内存操作数。[rsi](它从to复制[rdi],并递增两个指针。或根据 DF 递减,这是另一个隐式输入)。

x86的inc指令只有一个操作数,可以是寄存器也可以是内存。(实际上 FLAGS 是一个隐式输出操作数,就像大多数 x86 指令一样)。


push 3递减堆栈指针并存储到内存(使用堆栈指针的新值作为地址)。在 x86 和许多其他架构上都是如此(堆栈向下增长并指向最后推送的内容)。

因此,如果我们想了解完整的细节,push imm8有以下操作数:

  • 隐式读/写寄存器操作数:堆栈指针 ( rsp)
  • 隐式记忆目的地:[rsp]
  • 立即源值:8 位源,符号扩展为 64 位。

我们忽略了 x86 分段,或者我们可以算作ss一个额外的隐式输入操作数,以及rsp)。

于 2016-09-01T07:06:42.583 回答
2

隐含寻址模式:
隐含寻址模式也称为“隐式”或“固有”寻址模式,是指指令中未指定操作数(寄存器或内存位置或数据)的寻址模式。在这种模式下,操作数在指令定义中隐含指定。

例如:指令:“Complement Accumulator”是隐含模式指令,因为累加器寄存器中的操作数隐含在指令的定义中。在汇编语言中它写为:
CMA:取 AC 的内容的补码
类似地,指令,
RLC:循环累加器的内容是一个隐含模式指令。

除此之外,堆栈组织计算机中使用累加器和零地址指令的所有寄存器引用指令都是隐含模式指令,因为在累加器中隐含的寄存器引用操作数和零地址指令中,操作数隐含在顶部堆栈。


立即寻址模式:
在立即寻址模式下,操作数在指令本身中指定。换句话说,立即模式指令具有操作数字段而不是地址字段,其中包含要与指令中指定的操作数一起使用的实际操作数.即在该模式下,指令格式为:

例如: 说明:

MVI 06       将 06 移至累加器 将 05 移至累加器
ADD 05       的内容

除此之外,此模式对于将寄存器初始化为常数值非常有用。

于 2018-06-26T13:38:10.010 回答
2

隐含的:未直接指定。操作数地址未明确指定。

以 Stack 组织的零地址为例。

添加

这里没有直接指定操作数。栈顶的两个元素被弹出然后相加。请注意,操作数不直接存在于指令中。默示

立即:这很简单,操作数直接存在于地址字段中。地址字段更像操作数字段。

于 2017-10-31T15:17:54.313 回答