繁体   English   中英

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

[英]Difference between implied and immediate addressing mode?

隐含的 :操作数在指令的定义中隐式指定。 示例: 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中的位,而不是整个寄存器。)

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

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

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

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

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


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

因此,如果我们想了解全部细节, push imm8具有以下操作数:

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

我们忽略了x86分段,或者我们可以将ssrsp一起算作一个额外的隐式输入操作数。

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

以Stack组织的零地址为例。

这里没有直接指定操作数。 将弹出堆栈的两个顶部元素,然后将其添加。 注意,操作数并不直接存在于指令中。 默示

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

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

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

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


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

例如:指令:

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM