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

时间:2016-09-01 06:38:47

标签: assembly cpu-architecture cpu-registers instruction-set mano-machine

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

它主要用于零地址(STACK组织)和单地址(ACCUMULATOR组织)指令。

立即:操作数在指令本身中指定,主要用于常量。示例:ADD R1,#3MUL 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中,而不是整个寄存器。)

3 个答案:

答案 0 :(得分:3)

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

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

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

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

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

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

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

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

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

答案 1 :(得分:2)

暗示:未直接指定。操作数地址不是明确指定的。

以堆栈组织的零地址为例。

添加

这里没有直接指定操作数。弹出堆栈的两个顶部元素然后添加。请注意,操作数不直接出现在指令中。暗示

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

答案 2 :(得分:2)

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

例如:指令:“补数累加器”是隐含模式指令,因为指令定义中隐含了累加器寄存器中的操作数。在汇编语言中,其写为​​:
CMA:补充AC的内容
同样,说明,
RLC:旋转累加器的内容是一种隐含模式指令。

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


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

例如:指令:

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

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