Mengapa instruksi penyalinan biasanya bernama MOV?

23

Dalam cukup banyak assembler, instruksi penyalinan nilai biasanya dinamai "MOV" dan deskripsinya dalam manual biasanya juga berisi "move" (namun, kata lain dapat digunakan, seperti "load", "store", "extract", dll. ) Jarang menemukan ISA ) yang tidak mengikuti konvensi ini.

Di sisi lain, dalam konteks lain, "pindah" berbeda dari "salin" dalam arti bahwa sumber dihancurkan (misalnya, "mv" vs "cp" di Unix, Pindahkan [F6] di Norton Commander dan klon, dll. ) "Langkah" Assembler benar-benar memiliki "salinan" semantik, menjaga nilai sumber tetap utuh.

Saya telah menemukan bahwa ini telah dimulai setidaknya sejak IBM 1401 (1959), tetapi, IBM 360 menggunakan kata ini hanya untuk menyalin dalam penyimpanan, tetapi tidak untuk operasi antara register dan penyimpanan (yang menggunakan "memuat" dan "menyimpan") . Tapi mengapa masih banyak digunakan dan tidak diganti dengan "copy" atau "store"?

Netch
sumber
5
Wikipedia mengatakan : "Kata pindah untuk operasi ini, sebenarnya, keliru: itu tidak ada hubungannya dengan konsep fisik memindahkan objek dari A ke B, dengan tempat A kemudian menjadi kosong; MOV malah membuat salinan dari keadaan objek di A dan menimpa keadaan lama B dalam proses ini. Ini tercermin dalam beberapa bahasa rakitan lainnya dengan menggunakan kata-kata seperti memuat , menyimpan atau menyalin alih-alih memindahkan. "
Uwe Keim
@ UweKeim hmm, saya sudah googled untuk penjelasan sebelum pertanyaan tetapi tidak diberi makan dengan artikel ini. Pokoknya ini menjelaskan keadaan saat ini tetapi tidak memberikan petunjuk untuk asal-usul nyata ...
Netch
2
@gnat yang saya maksud adalah "Arsitektur Set Instruksi", bukan bus ISA. Saya sudah mengulanginya.
Netch
@Nerima terima kasih! Entah bagaimana saya berhasil melewatkannya dalam daftar besar disambiguasi di Wikipedia
agas
1
Saya ragu ada cara untuk mencari tahu mengapa ini awalnya disebut "pindah" daripada "menyalin", tetapi berspekulasi itu menyenangkan. Pada halaman wikipedia untuk bahasa rakitan , ini menggambarkan MOV sebagai operasi untuk "memindahkan salinan data", yang merupakan interpretasi yang menarik. Kemungkinan lain adalah dalam hal penggunaan MOV yang sebenarnya, operasinya secara konseptual merupakan pergerakan data; bahwa kita tidak peduli lagi dengan sumbernya.
Ben Lee

Jawaban:

10

Di beberapa set instruksi, ada instruksi berbeda untuk memuat register dari memori, menyimpan register ke memori, atau mentransfer sesuatu di antara register. Sementara beberapa bentuk bahasa assembly menggunakan kata kerja "load" untuk semuanya (mis. Zilog's Z80 menggunakan mnemonics ld a,(1234h), ld (1234h),adan ld a,b), dan beberapa menggunakan ransfer "T" (mis. 6502 dengan TXA untuk "transfer X ke A"), beberapa menggunakan "move" untuk operasi registrasi-ke-register untuk membedakannya dari muatan dan toko. Jika seseorang memiliki format instruksi seperti 68000 yang menggunakan formulir instruksi umum yang sama untuk register-to-register, register-to-register, memory-to-register, dan bahkan operasi memory-to-memory, kata kerja "pindah" adalah mungkin kata kerja tujuan umum yang lebih baik daripada alternatif lainnya.

Saya tidak tahu tentang set komputer mini atau mainframe sebelum 8080, tetapi 8080 menggunakan "load" dan "store" untuk sebagian besar instruksi akses memori dan "mov" untuk instruksi register-to-register, tetapi sebagian besar instruksi yang dapat beroperasi pada register 8-bit yang sewenang-wenang juga dapat beroperasi pada "M", yang merupakan lokasi memori yang ditangani oleh HL, sehingga "MOV" ke atau dari "M" akan benar-benar berperilaku sebagai pemuatan atau penyimpanan.

Adapun perbedaan antara "copy" dan "move", saya menduga itu ada hubungannya dengan fakta bahwa kode tidak dapat membuat atau menghancurkan register; mereka hanya ada. Dalam menggambarkan perilaku urutan kode mov bx,ax / mov ax,1234, apakah lebih masuk akal untuk mengatakan instruksi pertama menyalin bx ke kapak, dan instruksi kedua menghancurkan nilai axdan menggantinya dengan nilai 1234, atau lebih masuk akal untuk melihat yang pertama instruksi sebagai telah memindahkan nilai dari bx ke kapak (menjadikan nilai dalam kapak sebagai "tidak peduli"), dan instruksi kedua memuat kapak (yang tadinya tidak peduli) dengan 1234? Kadang-kadang register sumber masih bermakna setelah instruksi register-transfer, tetapi karena tidak ada dalam instruksi yang ditetapkan untuk menunjukkan apakah itu akan,

supercat
sumber
Saya tidak punya bukti untuk mendukung jawaban Anda, tapi itu kedengarannya benar. Operasi Load / Store akan mengambil jalur yang berbeda di CPU / mikrokode karena pergi ke memori / cache, tetapi bergerak di antara register mungkin satu siklus (tidak perlu menunggu pada tahap pipa lainnya) dan karenanya layak dibedakan. Tapi ini tidak menjelaskan langkah-vs-salin ...
JBRWilkinson
Sepakat. Pertimbangkan misalnya perangkat input yang dipetakan memori. Membaca lokasi sumber dapat memodifikasinya - misalnya membuang item yang Anda baca dari antrian perangkat keras, menggantinya dengan item antrian berikutnya. Itu terdengar seperti langkah daripada salinan - sumber tidak lagi memegang informasi itu, hanya tujuan yang melakukannya. Dan perilaku itu tidak diputuskan oleh CPU, itu ditentukan oleh perangkat yang dipetakan memori.
Steve314
Bahasa assembly menggunakan mnemonik yang "CPU-centric". Artinya, semuanya dinamai dari perspektif register CPU. Jadi, "memuat" biasanya menyalin nilai ke dalam register, sedangkan "menyimpan" biasanya menyalin satu dari register ke memori. Lalu apa yang disebut menyalin nilai dari satu register ke register lain? "Bergerak" adalah pilihan yang jelas. Jika operasi mikrokode yang sama melakukan keduanya (seperti pada 68000), "pindah" adalah pilihan yang lebih umum untuk memuat / menyimpan. "Copy" bisa saja digunakan tetapi mungkin berlebihan karena sebenarnya tidak ada yang namanya "move" yang sebenarnya, di mana sumbernya dibiarkan kosong.
DocSalvager
@ DocSalvage: Jika register 32-bit adalah kumpulan tetap dari 32 flip flop atau kait yang akan selalu ada, "bergerak" tidak selalu masuk akal. Dalam arsitektur dengan pengubahan nama register, operan "move" yang juga akan membatalkan sumber dapat meningkatkan efisiensi dengan membebaskan register virtual. Saya belum pernah mendengar hal seperti itu dilakukan, tetapi saya tidak tahu arsitektur apa pun yang dirancang dengan pengubahan nama register.
supercat
@supercat: Di perangkat keras komputer, semua register dan semua lokasi memori mengandung nilai setiap saat. Sebenarnya tidak ada yang namanya "null" atau "kosong". Kami menggunakan konvensi sewenang-wenang untuk menandakan ketika register atau konten memori tidak valid. Sangat sering, kita membiarkan "0" menandakan "null" tetapi tidak selalu. Keadaan "nol" dari blok memori misalnya dapat ditunjukkan dengan mulai dan berakhirnya alamat yang disimpan di lokasi lain. Ada banyak teknik lain juga. Pada akhirnya, mnemonik bahasa bersifat arbitrer meskipun kami mencoba untuk opsi yang paling banyak dipahami.
DocSalvager
0

Anda tentu benar. Kebanyakan jika tidak semua contoh dari instruksi mov sebenarnya adalah salinan.

Beberapa bahkan tidak benar-benar memiliki mov itu adalah instruksi palsu untuk

add dest=source+zero.

Juga mengerti bahwa sintaks ascii adalah arbitrer, kode mesin berarti sesuatu dan didefinisikan dan diperbaiki untuk prosesor itu. Sebagian besar, jika tidak, seluruh waktu, pembuat / penjual prosesor membuat sintaks sebagian untuk mendefinisikan set instruksi (kode mesin) dan sebagian untuk menentukan sintaks yang bekerja dengan alat yang juga mereka buat atau ditugaskan untuk mengubah bahasa assembly menjadi bahasa mesin. kode untuk prosesor mereka. Anda tentu dapat misalnya masuk ke assembler gnu (yang memiliki kecenderungan untuk melakukan hal sendiri dan tidak mengikuti sintaks vendor prosesor pula) dan menambahkan instruksi pseudo salinan.

Gunakan kasus: nah hari ini kebanyakan kode bahasa assembly adalah compiler yang dihasilkan, dan instruksi mov paling sering digunakan untuk benar-benar memindahkan nilai dari satu register ke register lain sehingga register sumber (lokasi memori, dll) dapat digunakan kembali. Untuk alasan konvensi pemanggilan untuk prosesor itu atau karena beberapa instruksi atau set instruksi tidak ortogonal, maka Anda harus memindahkan banyak hal. Tentu ada kalanya salinan nilai diinginkan dan perpindahan dapat digunakan untuk membuat salinan itu.

Saya ragu dengan serius apakah kita akan tahu individu atau tim mana yang muncul dengan istilah itu lebih dulu dan mengapa mereka memilih pindah salinan. Karena kita sudah terbiasa dengannya, kita cenderung menggunakannya kembali dengan setiap set instruksi baru. Seperti telah disebutkan beberapa set instruksi menggunakan register load dan menyimpan instruksi di mana satu operan adalah register dan yang lainnya adalah sebuah alamat, dan pindah hanya untuk register untuk mendaftar kasing. Dan set instruksi lainnya menggunakan mov untuk register atau mem untuk operan. Meskipun Anda tentu saja dapat menambahkan salinan ke setiap / banyak assembler open source, mendapatkan daya cengkeram pada penggunaannya akan lebih sulit. Jika Anda bekerja di suatu tempat di mana Anda memiliki kontrol atas sintaks asli (bekerja untuk tempat membuat prosesor baru) di mana Anda dapat menentukan register untuk mendaftar pindah disebut copy,

old_timer
sumber
-4

Mengganti instruksi berarti melanggar kompatibilitas. Assembler dengan sintaks baru tidak akan dapat merakit kode yang ditulis dengan sintaks lama - kecuali kode itu tidak menggunakan instruksi itu (dan satu-satunya tempat di mana Anda akan melihat kode assembly yang tidak digunakan MOVadalah dalam contoh sintaksis yang menunjukkan instruksi lain ...)

Kompiler biasanya menghasilkan kode rakitan dan secara otomatis meneruskannya ke assembler, sehingga mereka harus dimodifikasi juga agar sesuai dengan assembler baru. Jika bahasa memungkinkan perakitan inline, kode sumber lama yang menggunakan assembler inline dengan MOVinstruksi tidak akan berfungsi lagi.

Jadi, kita berbicara tentang kerusakan kode raksasa, dan untuk apa? itu tidak akan membuat bahasa lebih mudah dibaca, karena tidak seperti bahasa tingkat tinggi Anda tidak memiliki kesempatan untuk mengatakan apa yang dilakukan kode assembly tanpa mengetahui assembly, dan jika Anda tahu assembly, Anda tahu apa yang MOVdilakukan.

Biaya besar dengan nol keuntungan dengan mudah menjelaskan mengapa instruksi belum diganti nama.

Idan Arye
sumber
3
bagaimana ini menjawab pertanyaan yang diajukan?
nyamuk
2
Satu-satunya kalimat yang diakhiri dengan tanda tanya adalah 'Tetapi mengapa masih digunakan secara luas dan tidak diganti dengan "copy" atau "store"?'.
Idan Arye
2
Ini tidak menjelaskan mengapa instruksi tersebut dinamai demikian sejak awal, oleh banyak SPA yang dirancang dari awal (yaitu tanpa kendala kompatibilitas ke belakang) selama beberapa dekade. Juga, jika vendor ingin mengubah mnemonik meskipun ada kompatibilitas, mereka dapat memberikan alias dan mempromosikan penggunaannya.
1
Apa artinya "OP"? Dan, saya belum melihat penjelasan nyata.
Netch
1
Saya poster asli dan saya akan menyatakan menyalin antara sel-sel memori di S / 360 bukan "operasi yang sedikit berbeda" tetapi hanya kasus khusus dari menyalin yang sama. Pertanyaannya masih belum terpecahkan.
Netch