【发布时间】: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 上隐式操作数的更多示例:SAHF、LAHF 和 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.
来源: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
更多示例包括 CLC、STC 和 CMC,它们分别清除、设置或翻转进位标志 CF。 (CF 是 FLAGS 中的一个位,而不是整个寄存器。)
【问题讨论】:
-
如何检查指令是隐含的还是立即的? 这真的没有意义。您必须分别查看每个操作数,而不是整个指令。例如PUSH 隐式存储到堆栈,但其显式操作数可以是寄存器或立即数。在某些架构上,比如 x86,PUSH 甚至可以接受内存操作数。
PUSH r/m32为1个操作码,寻址方式选择内存或寄存器源。 -
@Peter 如果指令是
PUSH A操作数在内存中,那么它是隐含模式,因为操作数不是实际操作数? -
尚不清楚为什么它很重要。只需使用说明即可。
-
@PSPCODER:这个问题显然是关于某种累加器架构,其中操作数始终是隐式的。用 x86 示例替换大部分问题是不合适的。您的编辑会更好地作为答案,或者可能是问题在原始文本之后的单独部分。
标签: assembly cpu-architecture cpu-registers instruction-set mano-machine