MOV D D是什么意思?

4

在汇编语言中,指令

MOV A B

意味着将 B(源)的内容移动到 A(目标)。
我突然想到这条指令。

MOV D D

这意味着什么?

我在我的实验手册中看到过这个。截图如下:

enter image description here


1
这可能是编写无操作的一种方式。 - Kerrek SB
@HansPassant; 你的意思是这些指令没有被禁用,只是为了不增加成本而这样做的吗? - haccks
2
这个问题是关于8085汇编语言的吗? - John Saunders
为什么要关闭投票?难道这与编程无关吗? - haccks
3个回答

7
8085寄存器对寄存器的MOV指令是正交的。也就是说,有操作码将任何8位寄存器移动到其他任何8位寄存器中。因此MOV D,D将D寄存器的内容移动到D寄存器中。它不执行任何有用的操作,也不影响任何标志位,但与MOV A,AMOV B,B等一样,它也是有效的指令。
将一个寄存器复制到自身实际上是“无操作”或NOP指令。 "官方" 8085 NOP的操作码是00,但是任何寄存器移动到自身的指令都具有相同的效果。
这实际上只是处理器设计的一个产物。有一些技巧可以利用这些指令,但它们通常没有什么用处。

我们什么时候需要使用 NOP 指令? - haccks
1
根据Wikipedia条目所述:“NOP通常用于计时、强制内存对齐、防止危险、占据分支延迟插槽或作为一个占位符,在程序开发后被实际指令替换...” - Jim Mischel
1
不适用于8085,这些考虑只适用于具有流水线的处理器。您可以使用它来在调试汇编代码时禁用代码。这个问题让我感觉很老 :) - Hans Passant
@HansPassant:我似乎记得在8080和Z80上使用NOP来进行定时循环和一些相当不可靠的自修改代码。 - Jim Mischel
当您不确定指令将流向何处时,NOP 也是有用的。添加大量一字节的 NOP 可为控制流提供安全的“着陆区”。 - Kerrek SB
1
另一个用途是在早期支持超线程的x86-Pentium处理器上使用“非法”的指令 rep nop,这在自旋锁的忙等自旋过程中有效地产生了一个yield。后来的处理器添加了专用的 pause 指令来实现这一目的。(它是相同的指令,只是文档化了。) - Kerrek SB

5
你必须记住,8085是在1977年设计的。 集成电路工艺技术当时远没有那么先进,芯片上可放置晶体管的数量有一个相当严格的上限。这个处理器只使用了6500个晶体管。
这就对他们能够用来实现处理器的逻辑造成了很大限制。选择操作数的操作码中的位直接传递到寄存器组多路复用器中。并且在使用寄存器的其他指令中占据相同的位位置和意义。把预算烧掉来使不合理的操作数变得特殊并没有可用的资源。更简单、更便宜的方式是让它们保持原样,并且不浪费逻辑去处理异常情况。
这并不是什么大问题,没有人会无意中使用无意义的指令。

顺便说一下,反过来也是可以的,有时候处理器的指令集中会有明显的漏洞。Z80就是这样。最初几次硅片制造出现了一个有缺陷的指令,但并不被认为是必要修复的。所以他们就把它从文档中删除了。或者保留在那里,6502则以其极具吸引力的价格而著称,但存在很多漏洞


感谢分享这些历史信息。很高兴知道。 - haccks

1
这是一个NOP操作,用于程序延迟。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接