Por que a instrução de cópia geralmente se chama MOV?

23

Em muitos montadores, uma instrução de cópia de valor geralmente é chamada de "MOV" e sua descrição nos manuais geralmente também contém "movimento" (no entanto, outras palavras podem ser usadas, como "carregar", "armazenar", "extrair" etc.) ) É incomum encontrar um ISA ) que não segue esta convenção.

Por outro lado, em outros contextos, "mover" difere de "copiar" no sentido de que a fonte é destruída (por exemplo, "mv" vs. "cp" no Unix, Move [F6] no Norton Commander e clones, etc. ) O "movimento" do Assembler realmente tem uma "cópia" semântica, mantendo intacto o valor de origem.

Descobri que isso começou pelo menos desde IBM 1401 (1959), mas o IBM 360 usou essa palavra apenas para cópia em armazenamento, mas não para operações entre registradores e armazenamento (que usavam "load" e "store") . Mas por que ainda é amplamente usado e não substituído por "copiar" ou "armazenar"?

Netch
fonte
5
A Wikipedia diz : "A palavra mover para esta operação é, estritamente falando, um nome impróprio: tem pouco a ver com o conceito físico de mover um objeto de A para B, com o local A se tornando vazio; um MOV em vez disso faz uma cópia de o estado do objeto em A e substitui o antigo estado de B. nesse processo. Isso é refletido em outras linguagens de montagem usando palavras como carregar , armazenar ou copiar em vez de mover. ".
Uwe Keim
@UweKeim hmm, pesquisei no Google por explicações antes da pergunta, mas não fui alimentado com este artigo. De qualquer forma isso explica o estado atual, mas não dá uma pista para a origem reais ...
netch
2
@gnat Eu quis dizer "Arquitetura do Conjunto de Instruções", não um barramento ISA. Eu reeditei isso.
Netch
@ Thanks Netch! Eu de alguma forma conseguiu perder isso em uma grande lista de disambiguations na Wikipedia
mosquito
1
Duvido que haja alguma maneira de descobrir por que foi originalmente chamado de "movimento" em vez de "cópia", mas especular é divertido. Na página da Wikipedia para linguagem assembly , descreve o MOV como uma operação para "mover uma cópia dos dados", o que é uma interpretação interessante. Outra possibilidade é que, em termos de usos reais do MOV, a operação seja conceitualmente um movimento de dados; que não nos importamos mais com a fonte.
Ben Lee.

Respostas:

10

Em alguns conjuntos de instruções, existem instruções distintas para carregar um registro da memória, armazenar um registro na memória ou transferir itens entre registradores. Enquanto algumas formas de linguagem assembly usam o verbo "load" para tudo (por exemplo, os mnemônicos Z80 da Zilog usam ld a,(1234h), ld (1234h),ae ld a,b), e algumas usam transferência "T" (por exemplo, o 6502 com TXA para "transferir X para A"), outras usam "move" para operações regster-to-register para distingui-las de cargas e lojas. Se alguém possui um formato de instrução como o 68000, que usa o mesmo formulário de instrução geral para operações de registro em registro, registro em memória, memória em registro e até mesmo memória em memória, o verbo "mover" é provavelmente um verbo de uso geral melhor do que qualquer uma das alternativas.

Não tenho idéia dos conjuntos de instruções para minicomputadores ou mainframe anteriores ao 8080, mas o 8080 usava "load" e "store" para a maioria das instruções de acesso à memória e "mov" para instruções de registro em registro, mas a maioria das instruções que poderiam operar em um registro arbitrário de 8 bits também poderia operar em "M", que era o local da memória endereçado por HL, para que um "MOV" de ou para "M" se comportasse como uma carga ou armazenamento.

Quanto à distinção entre "copiar" e "mover", suspeito que isso tenha muito a ver com o fato de que o código não pode criar nem destruir registros; eles simplesmente existem. Ao descrever o comportamento da sequência de código mov bx,ax / mov ax,1234, faz mais sentido dizer que a primeira instrução copia bx para ax, e a segunda instrução destrói o valor axe o substitui pelo valor 1234, ou faz mais sentido exibir a primeira a instrução como tendo movido o valor de bx para ax (tornando o valor em ax um "não se importa"), e a segunda instrução carrega ax (que não se importava) com 1234? Às vezes, os registros de origem ainda são significativos após uma instrução de transferência de registro, mas como não há nada no conjunto de instruções para indicar se será,

supercat
fonte
Não tenho nenhuma evidência para apoiar sua resposta, mas certamente parece certo. As operações de carregamento / armazenamento seguirão um caminho diferente na CPU / microcódigo devido à memória / cache, mas a movimentação entre registradores pode muito bem ser de ciclo único (não é preciso esperar em outros estágios do pipeline) e, portanto, vale a pena diferenciar. Mas isso não explica move-vs-cópia ...
JBRWilkinson
Acordado. Considere, por exemplo, dispositivos de entrada mapeados na memória. A leitura de um local de origem pode modificá-lo - por exemplo, descartar o item que você lê de uma fila de hardware, substituindo-o pelo próximo item na fila. Isso soa mais como uma mudança do que uma cópia - a fonte não contém mais essas informações, apenas o destino. E esse comportamento não é decidido pela CPU, é decidido por esse dispositivo mapeado na memória.
Steve314
As linguagens assembly usam mnemônicos que são "centrados na CPU". Ou seja, tudo é nomeado da perspectiva dos registros da CPU. Assim, "carregar" geralmente copia um valor em um registro, enquanto "armazenar" geralmente copia um valor de um registro para a memória. O que chamar então de copiar um valor de um registrador para outro? "Mover" é uma escolha óbvia. Se a mesma operação de microcódigo executar ambos (como no 68000), "mover" é uma opção mais genérica para carregamento / armazenamento. "Copiar" poderia ter sido usado, mas pode ser redundante, pois não existe realmente um "movimento" verdadeiro, onde a fonte é deixada vazia.
DocSalvager
@DocSalvage: Se um registro de 32 bits é um conjunto fixo de 32 chinelos ou trincos que sempre existirão, "mover" não faz necessariamente sentido. Em arquiteturas com renomeação de registros, no entanto, um operando "move" que também invalidaria a fonte poderia melhorar a eficiência liberando um registro virtual. Eu nunca ouvi falar de algo assim, mas não conheço nenhuma arquitetura projetada com a renomeação de registros em mente.
Supercat
@ supercat: No hardware do computador, todos os registros e todos os locais de memória contêm um valor o tempo todo. Na verdade, não existe "nulo" ou "vazio". Usamos convenções arbitrárias para indicar quando o conteúdo do registro ou da memória é inválido. Muitas vezes, deixamos "0" significar "nulo", mas nem sempre. O estado "nulo" de um bloco de memória, por exemplo, pode ser indicado pelos endereços inicial e final armazenados em outro local. Existem inúmeras outras técnicas também. Por fim, a mnemônica da linguagem é arbitrária, embora tentemos a opção mais amplamente compreendida.
DocSalvager
0

Você certamente está certo. A maioria, se não todas, as instâncias de uma instrução mov são na verdade uma cópia.

Alguns nem sequer têm um mov, é uma pseudo-instrução para

add dest=source+zero.

Entenda também que a sintaxe ascii é arbitrária, o código da máquina significa algo e é definido e corrigido para esse processador. Na maioria das vezes, o tempo todo, o criador / fornecedor do processador cria uma sintaxe em parte para definir o conjunto de instruções (código de máquina) e em parte para definir uma sintaxe que funcione com uma ferramenta que eles também criaram ou comissionaram para converter essa linguagem de montagem em máquina código para o processador. Você certamente pode, por exemplo, acessar o montador do gnu (que tem tendência a fazer suas próprias coisas e não seguir a sintaxe dos fornecedores de processadores de qualquer maneira) e adicionar uma pseudo-instrução de cópia.

Casos de uso: atualmente, a maioria dos códigos da linguagem assembly é gerada pelo compilador, e a instrução mov é mais frequentemente usada para realmente mover um valor de um registro para outro, para que o registro de origem (local da memória, etc.) possa ser reutilizado. Por motivos de convenção de chamada para esse processador ou porque algumas instruções ou conjuntos de instruções não são ortogonais, é necessário mudar as coisas. Certamente, há momentos em que uma cópia de um valor é desejada e o mov pode ser usado para fazer essa cópia.

Duvido seriamente que algum dia saberemos qual indivíduo ou equipe inventou o termo primeiro e por que eles escolheram mudar sobre a cópia. Como nos acostumamos a isso, tendemos a reutilizá-lo com cada novo conjunto de instruções. Como já mencionado, alguns conjuntos de instruções usam carregamento baseado em registro e armazenam instruções em que um operando é um registro e o outro é um endereço, e mov apenas para o registro para registrar casos. E outros conjuntos de instruções usam mov para register ou mem para qualquer operando. Embora você possa certamente adicionar uma cópia a qualquer um dos montadores de código-fonte aberto, obter tração no uso será mais difícil. Se você trabalha em algum lugar em que tem controle sobre a sintaxe original (trabalha em um local que cria um novo processador), em que é possível ditar o registro para registrar a movimentação, isso se chama cópia,

old_timer
fonte
-4

Substituir uma instrução significa quebrar a compatibilidade com versões anteriores. Um assembler com a nova sintaxe não poderá montar o código escrito com a sintaxe antiga - a menos que esse código não use essa instrução (e o único lugar em que você verá um código de assembly que não usa MOVestá em exemplos de sintaxe que mostram outras instruções ...)

Os compiladores geralmente geram código de montagem e o passam automaticamente para o montador; portanto, eles também precisam ser modificados para se ajustarem ao novo montador. Se um idioma permitir montagem em linha, o código-fonte antigo que usa o assembler em linha com MOVinstruções não funcionará mais.

Então, estamos falando de uma quebra gigantesca de código e para quê? não tornará a linguagem mais legível, porque, diferentemente de uma linguagem de alto nível, você não tem chance de dizer o que um código de assembly faz sem conhecer o assembly, e se você conhece o assembly, sabe o que MOVfaz.

Um custo enorme com ganho zero explica facilmente por que a instrução não foi renomeada.

Idan Arye
fonte
3
Como isso responde à pergunta?
mosquito
2
A única frase que termina com um ponto de interrogação é 'Mas por que ainda é amplamente usada e não substituída por "copiar" ou "armazenar"?'.
Idan Arye
2
Ele não explica por que a instrução foi nomeada como tal, por inúmeros ISAs projetados do zero (ou seja, sem restrições de compatibilidade com versões anteriores) ao longo de muitas décadas. Além disso, se um fornecedor quisesse alterar o mnemônico, apesar da compatibilidade com versões anteriores, ele poderia fornecer um alias e promover seu uso.
1
O que significa "OP"? E eu não vi uma explicação real.
Netch
1
Sou o pôster original e declararei que a cópia entre células de memória no S / 360 não é "uma operação ligeiramente diferente", mas é apenas um caso especial da mesma cópia. A questão ainda está sem solução.
Netch