隐含寻址模式和立即寻址模式的区别?

Kam*_*tap 1 assembly instruction-set cpu-architecture cpu-registers mano-machine

隐含:在指令定义中隐式指定操作数。示例:CLACMEINP

主要用于零地址(STACK-organized)和一地址(ACCUMULATOR-organized)指令。

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

但问题是如何检查指令:

1) PUSH 3

2)LD 7

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

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


在x86隐含操作数的进一步的实例:SAHFLAHF,和CPUID

来源: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.
Run Code Online (Sandbox Code Playgroud)

来源: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.
Run Code Online (Sandbox Code Playgroud)

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

MOV AH, 25H       ; immediate source operand
SAHF              ; implicit operands
Run Code Online (Sandbox Code Playgroud)

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

Pet*_*des 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)。

  • 为什么这个答案会被否决?每个操作数有一种寻址方式;整个说明可以有 1 个以上。我认为这个答案没有任何问题,而且 IMO 仍然是比其他答案更好的答案。 (2认同)