【问题标题】:Difference between implied and immediate addressing mode?隐含寻址模式和立即寻址模式之间的区别?
【发布时间】:2017-01-08 21:51:12
【问题描述】:

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

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

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

【问题讨论】:

  • 如何检查指令是隐含的还是立即的? 这真的没有意义。您必须分别查看每个操作数,而不是整个指令。例如PUSH 隐式存储到堆栈,但其显式操作数可以是寄存器或立即数。在某些架构上,比如 x86,PUSH 甚至可以接受内存操作数。 PUSH r/m32为1个操作码,寻址方式选择内存或寄存器源。
  • @Peter 如果指令是 PUSH A 操作数在内存中,那么它是隐含模式,因为操作数不是实际操作数?
  • 尚不清楚为什么它很重要。只需使用说明即可。
  • @PSPCODER:这个问题显然是关于某种累加器架构,其中操作数始终是隐式的。用 x86 示例替换大部分问题是不合适的。您的编辑会更好地作为答案,或者可能是问题原始文本之后的单独部分。

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


【解决方案1】:

像 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 分段,或者我们可以将 ssrsp 一起算作额外的隐式输入操作数。

【讨论】:

  • 为什么这个答案会被否决?每个操作数有一种寻址方式;整个指令可以有超过 1 个。我认为这个答案没有任何问题,而且 IMO 它仍然是一个比其他答案更好的答案。
  • 你在每一个问题上大声笑。是的,写入rsprsp 的“隐含寄存器寻址”,然后写入[rsp] 就像“隐含寄存器间接寻址”,然后 imm8 是“立即寻址”。如果寻址适用于整个指令/操作码,那么推送将是“隐含寄存器隐含寄存器间接立即寻址”,这是无稽之谈。 push rbp 你可以打电话给rbp '寄存器寻址';它并不是真正隐含的,但只有一个操作码字节.. Implied addressing refers to instructions that comprise only an opcode without an operand
  • @LewisKelsey:是的,您可以将 push reg 视为 8 个单独的推送隐式操作码,或者作为一个为 3 位显式 reg 字段留出空间的操作码。鉴于与 REX.B 的交互以编码 push r8..r15,我认为在大多数情况下,显式解释(对于源操作数)更有意义。 felixcloutier.com/x86/push 表示 50+rd 用于编码。它将表字段称为“操作码”,但实际上它是整个指令的编码,例如 6A ib for push imm8
【解决方案2】:

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

以 Stack 组织的零地址为例。

添加

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

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

【讨论】:

    【解决方案3】:

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

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

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


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

    例如:指令:

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

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

    【讨论】:

    • 如果一个带有CMA 指令的CPU 也有一条指令来补充一些其他的寄存器,你可以说它有一个明确的目的地。 (带有累加器的实际 CPU 通常除了累加器之外还有几个其他寄存器,例如,一些 16 位指针寄存器与 8 位 AC 分开。它们通常支持对它们的一些操作,如增量,但不如 AC 上那么多)。或者你可能会说这两条指令是不相关的并且有隐含的目标,如果它们的指令编码不同,而不是除了对目标进行位或 2 编码之外是相同的。
    • 我也不确定这是否真的回答了这个问题,因为MVI 6 也有 AC 作为隐式目的地,而 OP 的困惑在于整个指令只有一个模式。不过还是不错的答案,欢迎来到 Stack Overflow。
    猜你喜欢
    • 1970-01-01
    • 2018-05-31
    • 1970-01-01
    • 2015-05-09
    • 2015-04-11
    • 1970-01-01
    • 2012-05-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多