为什么复制指令通常命名为MOV?


23

在许多汇编器中,值复制指令通常称为“ MOV”,其说明中通常也包含“ move”(但是,可以使用其他词,如“ load”,“ store”,“ extract”等。 )找到不遵循此约定的ISA并不常见。

另一方面,在其他情况下,“ move”与“ copy”在破坏源的意义上有所不同(例如,Unix中的“ mv”与“ cp”,Norton Commander中的 Move [F6] 和克隆等)。 )汇编程序的“移动”确实具有语义上的“复制”,从而保持了源值的完整性。

我发现这至少是从IBM 1401(1959)开始的,但是IBM 360仅将此词用于存储内复制,而不用于寄存器和存储(使用“ load”和“ store”)之间的操作。 。但是,为什么它仍然被广泛使用,而不是被“复制”或“存储”取代?


5
维基百科说:“从严格意义上讲,“移动”一词用词不当:与将物体从A移到B,然后将位置A变空的物理概念无关; MOV却复制了在此过程中,对象的状态将变为A,并覆盖B的旧状态。这在其他一些汇编语言中也可以通过使用loadstorecopy而不是move 来反映出来。”
Uwe Keim 2013年

@UweKeim嗯,我在提出问题之前已经在Google上进行了解释,但没有获得这篇文章。无论如何,这解释了当前的状态,但是没有给出真实起源的线索……
Netch

2
@gnat我的意思是“指令集体系结构”,而不是ISA总线。我已对其进行了编辑。
Netch

@Netch谢谢!我以某种方式设法在Wikipedia上
gnat 2013年

1
我怀疑是否有任何方法可以找出为什么它最初被称为“移动”而不是“复制”,但是推测很有趣。在用于汇编语言Wikipedia页面上,它将MOV描述为“移动数据副本”的操作,这是一个有趣的解释。另一种可能性是,就MOV的实际使用而言,该操作从概念上讲是一种数据移动;我们不再关心来源。
李·李

Answers:


10

在某些指令集中,存在截然不同的指令,用于从内存中加载寄存器,将寄存器存储到内存中或在寄存器之间进行传输。虽然一些汇编语言形式使用的一切动词“负载”(如Zilog公司的Z80助记符使用ld a,(1234h)ld (1234h),ald a,b),有的采用“T”转让(BOT)(例如6502与TXA为“转移X到A”),有的使用“移动”寄存器到寄存器的操作,以区别于加载和存储。如果一个指令格式像68000,使用相同的通用指令形式进行寄存器到寄存器,寄存器到内存,内存到寄存器甚至内存到内存操作,则动词“ move”为可能比其他任何一种更好的通用动词。

我对8080之前的微型计算机或大型机指令集一无所知,但8080使用“加载”和“存储”表示大多数内存访问指令,使用“ mov”表示寄存器到寄存器指令,但是大多数可以操作的指令任意8位寄存器上的“ MOV”也可以在HL寻址的存储单元“ M”上进行操作,因此与“ M”之间的“ MOV”实际上将充当加载或存储操作。

至于“复制”和“移动”之间的区别,我怀疑这与代码既不能创建也不破坏寄存器的事实有关。他们只是存在。在描述代码序列的行为时,mov bx,ax / mov ax,1234说第一条指令将bx复制到ax更有意义,第二条指令销毁其中的值ax并将其替换为值1234,还是查看第一条指令更有意义指令已将值从bx移至ax(将ax中的值设为“无关”),第二条指令将1234(已无关)装入ax(原为“无关”)?有时,在执行寄存器传输指令后,源寄存器仍然有意义,但是由于指令集中没有任何内容表明是否将要使用,


我没有任何证据支持您的回答,但听起来确实是正确的。加载/存储操作由于要转到内存/缓存而将在CPU /微代码中采用不同的路径,但是在寄存器之间移动很可能是单周期的(无需等待其他流水线级),因此值得区分。但这并不能解释move-vs-copy ...
JBRWilkinson

同意 考虑例如存储器映射的输入设备。读取源位置可以对其进行修改-例如,丢弃从硬件队列中读取的项目,将其替换为下一个排队的项目。这听起来像是一个举动,而不是复制品-来源不再拥有该信息,只有目的地才拥有。这种行为不是由CPU决定的,而是由内存映射的设备决定的。
Steve314 2013年

汇编语言使用以“ CPU为中心”的助记符。也就是说,所有内容都是从CPU寄存器的角度命名的。因此,“加载”通常将一个值复制到寄存器中,而“存储”通常将一个值从寄存器复制到内存中。那么将值从一个寄存器复制到另一个寄存器又叫什么呢?“移动”是显而易见的选择。如果执行相同的微代码操作(如68000),则“移动”是加载/存储的更通用选择。“复制”本来可以使用,但可能是多余的,因为实际上并没有真正的“移动”之类的东西,在源中将其留空。
DocSalvager 2013年

@DocSalvage:如果一个32位寄存器是一堆固定的32个触发器或锁存器,它们将一直存在,则“移动”不一定有意义。但是,在具有寄存器重命名的体系结构中,也会使源无效的“移动”操作数可以通过释放虚拟寄存器来提高效率。我从未听说过要完成这样的事情,但是我不知道任何设计时考虑寄存器重命名的体系结构。
2013年

@supercat:在计算机硬件中,所有寄存器和所有内存位置始终都包含一个值。实际上,没有“空”或“空”之类的东西。我们使用任意约定来表示何时寄存器或存储器内容无效。很多时候,我们让“ 0”表示“空”,但并非总是如此。存储器块的“空”状态例如可以由存储在另一位置的开始和结束地址指示。还有许多其他技术。最终,语言助记符是任意的,尽管我们尝试使用最广泛理解的选项。
DocSalvager 2013年

0

你当然是对的。mov指令的大多数(如果不是全部)实例实际上是副本。

有些人甚至根本没有动作,这是一个伪指令

add dest=source+zero.

还应了解,ascii语法是任意的,机器代码意味着某种含义,并已为该处理器定义和固定。在大多数情况下(即使不是全部),处理器创建者/供应商都会创建一种语法,以定义指令集(机器代码),一部分定义与他们还创建或委托将汇编语言转换为机器的工具一起使用的语法。处理器的代码。例如,您当然可以进入gnu汇编器(它倾向于做自己的事情并且始终不遵循处理器供应商的语法)并添加一条copy伪指令。

用例:如今,大多数汇编语言代码都是由编译器生成的,并且mov指令最常用于将值从一个寄存器实际移动到另一个寄存器,以便可以重复使用源寄存器(内存位置等)。由于该处理器的调用约定或某些指令或指令集不正交,因此必须四处移动。当然,有时需要复制值,并且可以使用mov来复制该值。

我严重怀疑我们是否会知道什么人或团队首先提出了这个词,以及他们为什么选择移而复写。因为我们已经习惯了它,所以我们倾向于在每个新的指令集上重复使用它。如前所述,一些指令集使用基于寄存器的加载和存储指令,其中一个操作数是一个寄存器,另一个操作数是一个地址,仅将寄存器移动到寄存器大小写。其他指令集将mov用于寄存器,将mem用于任一操作数。尽管您当然可以将副本添加到任何/许多开源汇编程序中,但要吸引使用它的难度将更大。如果您在可以控制原始语法的地方工作(在制造新处理器的地方工作),而您可以在该地方指定寄存器到寄存器的移动称为复制,


-4

替换指令意味着破坏向后兼容性。使用新语法的汇编器将无法汇编使用旧语法编写的代码-除非该代码不使用该指令(并且唯一会MOV在语法示例中看到未使用的汇编代码的地方)显示其他说明...)

编译器通常会生成汇编代码,并自动将其传递给汇编器,因此也必须对其进行修改以适合新的汇编器。如果一种语言允许内联汇编,MOV则将内联汇编器与指令一起使用的旧源代码将不再起作用。

那么,我们谈论的是巨大的代码破损,又是什么呢?它不会使该语言更具可读性,因为与某些高级语言不同,您不知道汇编就没有机会知道汇编代码的作用,并且如果您知道汇编就知道该做什么MOV

零收益的巨大成本很容易解释了为什么指令没有被重命名。


3
这如何回答所提问题?
gnat 2013年

2
唯一以问号结尾的句子是“但是为什么它仍被广泛使用而不用“ copy”或“ store”代替?”。
Idan Arye 2013年

2
它并没有解释为什么数十年来从无到有(从无后向兼容约束)设计的无数ISA为何将指令如此命名。同样,如果供应商希望在向后兼容的情况下更改助记符,则可以提供别名并促进其使用。

1
“ OP”代表什么?而且,我还没有看到真正的解释。
Netch

1
我是原始发布者,我将声明S / 360中存储单元之间的复制不是 “稍有不同的操作”,而只是相同复制的特殊情况。这个问题至今仍未解决。
Netch
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.