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"?
Jawaban:
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),a
danld 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 nilaiax
dan 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,sumber
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
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,
sumber
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
MOV
adalah 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
MOV
instruksi 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
MOV
dilakukan.Biaya besar dengan nol keuntungan dengan mudah menjelaskan mengapa instruksi belum diganti nama.
sumber