ทำไมคำสั่งการคัดลอกมักใช้ชื่อว่า MOV?


23

ในแอสเซมบลีค่อนข้างมากคำสั่งการคัดลอกค่ามักจะชื่อ "MOV" และคำอธิบายในคู่มือมักจะมี "ย้าย" (อย่างไรก็ตามคำอื่น ๆ สามารถใช้เช่น "โหลด", "เก็บ", "เก็บ", "แยก" ฯลฯ ) ) เป็นเรื่องแปลกที่จะหาISA ) ที่ไม่ปฏิบัติตามอนุสัญญานี้

ในทางตรงกันข้ามในบริบทอื่น ๆ "ย้าย" แตกต่างจาก "คัดลอก" ในแง่ที่แหล่งที่ถูกทำลาย (ตัวอย่างเช่น "mv" กับ "cp" ใน Unix ย้าย [F6] ในนอร์ตันผู้บัญชาการและโคลน ฯลฯ ) "การย้าย" ของ Assembler มีความหมาย "การคัดลอก" จริง ๆ ทำให้ค่าของแหล่งข้อมูลครบถ้วน

ฉันพบว่าสิ่งนี้เริ่มต้นอย่างน้อยตั้งแต่IBM 1401 (1959) แต่IBM 360ใช้คำนี้เฉพาะสำหรับการคัดลอกในหน่วยเก็บข้อมูล แต่ไม่ได้สำหรับการดำเนินการระหว่างการลงทะเบียนและหน่วยเก็บข้อมูล (ซึ่งใช้ "load" และ "store") . แต่ทำไมมันยังคงใช้กันอย่างแพร่หลายและไม่แทนที่ด้วย "คัดลอก" หรือ "เก็บ"?


5
Wikipedia บอกว่า : "การย้ายคำสำหรับการดำเนินการนี้คือการพูดอย่างไม่ถูกต้องนักเรียกชื่อผิด: มันมีส่วนเกี่ยวข้องกับแนวคิดทางกายภาพในการเคลื่อนย้ายวัตถุจาก A ไปยัง B โดยที่ A กลายเป็นว่างเปล่าแล้ว MOV แทนสำเนา สถานะของวัตถุที่ A และเขียนทับรัฐเก่า B ในกระบวนการนี้. นี่คือภาพสะท้อนในภาษาประกอบอื่น ๆ โดยใช้คำเช่นโหลด , ร้านค้าหรือคัดลอกแทนการย้าย. "
Uwe Keim

@UweKeim อืมฉันได้ไปอธิบายก่อนคำถาม แต่ไม่ได้รับอาหารกับบทความนี้ อย่างไรก็ตามนี้จะอธิบายถึงสถานะปัจจุบัน แต่ไม่ได้ให้เบาะแสสำหรับต้นกำเนิดที่แท้จริง ...
Netch

2
@gnat ฉันหมายถึง "Instruction Set Architecture" ไม่ใช่รถบัส ISA ฉันได้แก้ไขมันแล้ว
Netch

@Netch ขอบคุณ! ฉันพยายามที่จะพลาดสิ่งนั้นในรายการdisambiguations จำนวนมากที่ Wikipedia
gnat

1
ฉันสงสัยว่ามีวิธีใดที่จะค้นหาสาเหตุที่เดิมเรียกว่า "ย้าย" แทนที่จะเป็น "คัดลอก" แต่การเก็งกำไรนั้นสนุก ในหน้าวิกิพีเดียสำหรับภาษาแอสเซมบลีมันอธิบาย MOV เป็นการดำเนินการสำหรับ "ย้ายสำเนาของข้อมูล" ซึ่งเป็นการตีความที่น่าสนใจ ความเป็นไปได้อีกอย่างก็คือในแง่ของการใช้งานจริงของ MOV การดำเนินงานคือการเคลื่อนย้ายข้อมูล ที่เราไม่สนใจเกี่ยวกับแหล่งที่มาอีกต่อไป
Ben Lee

คำตอบ:


10

ในชุดคำสั่งบางชุดมีคำแนะนำที่แตกต่างกันในการโหลดรีจิสเตอร์จากหน่วยความจำเก็บรีจิสเตอร์ลงในหน่วยความจำหรือถ่ายโอนสิ่งต่าง ๆ ระหว่างรีจิสเตอร์ ในขณะที่บางรูปแบบภาษาประกอบใช้คำกริยา "ภาระ" สำหรับทุกอย่าง (เช่น Zilog ของจำ Z80 ใช้ld a,(1234h), ld (1234h),aและld a,b) และบางส่วนใช้ "T" ransfer (เช่น 6502 กับ TXA สำหรับ "การถ่ายโอน X เพื่อ A") บางใช้ "ย้าย" สำหรับการดำเนินการ regster-to-register เพื่อแยกความแตกต่างจากโหลดและร้านค้า หากมีรูปแบบคำสั่งเช่น 68000 ซึ่งใช้แบบฟอร์มคำสั่งทั่วไปแบบเดียวกันสำหรับการลงทะเบียนเพื่อลงทะเบียน, การลงทะเบียนสู่หน่วยความจำ, หน่วยความจำต่อการลงทะเบียนและแม้กระทั่งการดำเนินการหน่วยความจำต่อหน่วยความจำคำกริยา "ย้าย" คือ อาจเป็นคำกริยาที่มีวัตถุประสงค์ทั่วไปที่ดีกว่าทางเลือกใด ๆ

ฉันไม่มีความคิดเกี่ยวกับมินิคอมพิวเตอร์หรือชุดคำสั่งเมนเฟรมก่อน 8080 แต่ 8080 ใช้ "load" และ "store" สำหรับคำแนะนำการเข้าถึงหน่วยความจำส่วนใหญ่และ "mov" สำหรับคำแนะนำการลงทะเบียนเพื่อลงทะเบียน แต่คำแนะนำส่วนใหญ่ที่สามารถใช้งานได้ ในการลงทะเบียน 8 บิตโดยพลการยังสามารถทำงานกับ "M" ซึ่งเป็นตำแหน่งหน่วยความจำที่ระบุโดย HL ดังนั้น "MOV" ไปยังหรือจาก "M" จะทำงานเป็นโหลดหรือเก็บ

สำหรับความแตกต่างระหว่าง "คัดลอก" และ "ย้าย" ฉันสงสัยว่ามีส่วนเกี่ยวข้องกับความจริงที่ว่ารหัสไม่สามารถสร้างหรือทำลายทะเบียนได้ พวกมันมีอยู่จริง ในการอธิบายพฤติกรรมของลำดับของรหัสmov bx,ax / mov ax,1234มันทำให้รู้สึกมากกว่าที่จะพูดว่าคำสั่งแรกคัดลอก bx ไปยังขวานและคำสั่งที่สองทำลายค่าในaxและแทนที่ด้วยค่า 1234 หรือทำให้รู้สึกดูเป็นครั้งแรก คำสั่งที่มีการย้ายค่าจาก bx ไปยังขวาน (ทำให้ค่าในขวานเป็น "ไม่สนใจ") และคำสั่งที่สองโหลดขวาน (ซึ่งไม่ได้สนใจ) กับ 1234? บางครั้งผู้ลงทะเบียนแหล่งข้อมูลยังคงมีความหมายหลังจากคำสั่งลงทะเบียนถ่ายโอน แต่เนื่องจากไม่มีอะไรในชุดคำสั่งที่ระบุว่าจะเป็นเช่นนั้นหรือไม่


ฉันไม่มีหลักฐานอะไรมาสนับสนุนคำตอบของคุณ แต่มันฟังดูดี การดำเนินการโหลด / จัดเก็บจะใช้เส้นทางที่แตกต่างกันใน CPU / ไมโครโค้ดเนื่องจากการไปยังหน่วยความจำ / แคช แต่การย้ายระหว่างการลงทะเบียนอาจเป็นรอบเดียว (ไม่จำเป็นต้องรอในขั้นตอนไปป์ไลน์อื่น ๆ ) ดังนั้นจึงคุ้มค่า แต่นี่ไม่ได้อธิบายการย้าย vs-copy ...
JBRWilkinson

ตกลง พิจารณาเช่นอุปกรณ์อินพุตที่แมปหน่วยความจำ การอ่านตำแหน่งต้นทางสามารถแก้ไขได้ - เช่นการทิ้งรายการที่คุณอ่านจากคิวฮาร์ดแวร์แทนที่ด้วยรายการที่อยู่ในคิวถัดไป ฟังดูเหมือนเป็นการย้ายมากกว่าการคัดลอก - ที่มาไม่มีข้อมูลนั้นอีกต่อไป แต่มีเพียงปลายทางเท่านั้นที่ทำได้ และพฤติกรรมนั้นไม่ได้ถูกตัดสินโดยซีพียู แต่มันถูกตัดสินโดยอุปกรณ์ที่ใช้หน่วยความจำที่แมป
Steve314

ภาษาแอสเซมบลีใช้ตัวช่วยจำที่เป็น "CPU-centric" นั่นคือทุกอย่างถูกตั้งชื่อจากมุมมองของการลงทะเบียนของ CPU ดังนั้น "โหลด" มักจะคัดลอกค่าลงในทะเบียนในขณะที่ "เก็บ" มักจะคัดลอกหนึ่งจากลงทะเบียนไปยังหน่วยความจำ อะไรที่จะเรียกการคัดลอกค่าจากที่หนึ่งไปยังอีกที่ลงทะเบียน? "ย้าย" เป็นตัวเลือกที่ชัดเจน หากการดำเนินการไมโครโค้ดเดียวกันดำเนินการทั้งคู่ (เช่นเดียวกับใน 68000) "ย้าย" เป็นตัวเลือกทั่วไปสำหรับโหลด / จัดเก็บ "คัดลอก" อาจถูกนำมาใช้ แต่อาจซ้ำซ้อนเนื่องจากไม่มีสิ่งเช่น "ย้าย" ที่แท้จริงที่แหล่งที่ว่างเปล่า
DocSalvager

@DocSalvage: หากการลงทะเบียนแบบ 32- บิตเป็นพวงคงที่ของ 32 flops พลิกหรือสลักที่จะมีอยู่เสมอ "ย้าย" ไม่จำเป็นต้องทำให้รู้สึก ในสถาปัตยกรรมที่มีการเปลี่ยนชื่อรีจิสเตอร์อย่างไรก็ตามตัวถูกดำเนินการ "ย้าย" ซึ่งจะทำให้แหล่งที่มาไม่ถูกต้องสามารถปรับปรุงประสิทธิภาพได้โดยการเพิ่มรีจิสเตอร์เสมือน ฉันไม่เคยได้ยินเกี่ยวกับสิ่งที่กำลังทำ แต่ฉันไม่รู้สถาปัตยกรรมที่ออกแบบโดยคำนึงถึงการเปลี่ยนชื่อในใจ
supercat

@supercat: ในฮาร์ดแวร์คอมพิวเตอร์รีจิสเตอร์และตำแหน่งหน่วยความจำทั้งหมดมีค่าอยู่ตลอดเวลา ที่จริงแล้วไม่มีสิ่งเช่น "ว่างเปล่า" หรือ "ว่างเปล่า" เราใช้ข้อตกลงโดยพลการเพื่อบ่งบอกเมื่อเนื้อหาการลงทะเบียนหรือหน่วยความจำไม่ถูกต้อง บ่อยครั้งเราปล่อยให้ "0" มีความหมาย "null" แต่ไม่เสมอไป ตัวอย่างสถานะ "null" ของบล็อกหน่วยความจำอาจถูกระบุโดยที่อยู่เริ่มต้นและปลายทางที่เก็บไว้ในตำแหน่งที่ตั้งอื่น มีเทคนิคอื่น ๆ อีกมากมายเช่นกัน ในที่สุดแล้วตัวช่วยจำภาษามีความหมายแม้ว่าเราจะพยายามหาตัวเลือกที่เข้าใจกันอย่างกว้างขวางที่สุด
DocSalvager

0

คุณพูดถูก ส่วนใหญ่ถ้าไม่ใช่ทุกคำสั่งของคำสั่ง MOV นั้นจริง ๆ แล้วเป็นสำเนา

บางคนไม่ได้มี mov จริงๆมันเป็นคำสั่งหลอกสำหรับ

add dest=source+zero.

โปรดเข้าใจด้วยว่าไวยากรณ์ของ ASCII นั้นเป็นรหัสโดยอำเภอใจรหัสเครื่องหมายถึงบางสิ่งและมีการกำหนดและแก้ไขสำหรับตัวประมวลผลนั้น ส่วนใหญ่หากไม่ใช่ตลอดเวลาที่ผู้สร้าง / ผู้ขายตัวประมวลผลสร้างไวยากรณ์ในส่วนเพื่อกำหนดชุดคำสั่ง (รหัสเครื่อง) และส่วนหนึ่งเพื่อกำหนดไวยากรณ์ที่ทำงานกับเครื่องมือที่พวกเขาสร้างหรือมอบหมายให้แปลงภาษาแอสเซมบลีนั้นเป็นเครื่อง รหัสสำหรับหน่วยประมวลผล ตัวอย่างเช่นคุณสามารถเข้าไปในแอสเซมเบลอร์ gnu (ซึ่งมีแนวโน้มที่จะทำในสิ่งที่เป็นของตัวเองและไม่ทำตามไวยากรณ์ผู้ขายหน่วยประมวลผล) และเพิ่มคำสั่งหลอกสำเนา

ใช้กรณี: ทุกวันนี้รหัสภาษาแอสเซมบลีส่วนใหญ่ถูกสร้างขึ้นโดยคอมไพเลอร์และคำสั่ง mov มักใช้เพื่อย้ายค่าจากการลงทะเบียนหนึ่งไปยังอีกการบันทึกหนึ่งเพื่อให้การลงทะเบียนแหล่งที่มา (ตำแหน่งหน่วยความจำ ฯลฯ ) สำหรับเหตุผลของการประชุมที่เรียกตัวประมวลผลนั้นหรือเนื่องจากคำสั่งหรือชุดคำสั่งบางคำไม่ใช่แบบมุมฉากดังนั้นคุณต้องย้ายสิ่งต่างๆ แน่นอนว่ามีบางครั้งที่ต้องการคัดลอกค่าและ mov อาจถูกใช้เพื่อทำสำเนานั้น

ฉันสงสัยอย่างจริงจังว่าเราจะรู้ว่าบุคคลหรือทีมใดมากับคำก่อนและทำไมพวกเขาเลือกย้ายไปคัดลอก เนื่องจากเราคุ้นเคยกับมันเราจึงมักจะใช้มันกับชุดคำสั่งใหม่ทุกชุด ดังที่ได้กล่าวมาแล้วชุดคำสั่งบางชุดใช้การลงทะเบียนตามภาระและคำแนะนำการจัดเก็บที่หนึ่งตัวถูกดำเนินการคือการลงทะเบียนและอื่น ๆ เป็นที่อยู่และ mov สำหรับเพียงลงทะเบียนเพื่อลงทะเบียนกรณี และชุดการเรียนการสอนอื่น ๆ ใช้ mov สำหรับการลงทะเบียนหรือ mem สำหรับตัวถูกดำเนินการอย่างใดอย่างหนึ่ง แม้ว่าคุณจะสามารถเพิ่มการคัดลอกลงในแอสเซมเบลอร์โอเพนซอร์ซใด ๆ / หลาย ๆ อย่างการดึงการใช้งานของมันจะยากขึ้น หากคุณทำงานที่ไหนสักแห่งที่คุณสามารถควบคุมไวยากรณ์ดั้งเดิม (ทำงานสำหรับสถานที่ที่ทำโปรเซสเซอร์ใหม่) ซึ่งคุณสามารถกำหนดการลงทะเบียนเพื่อย้ายการลงทะเบียนเรียกว่าการคัดลอก


-4

การเปลี่ยนคำสั่งหมายถึงการทำลายความเข้ากันได้แบบย้อนหลัง แอสเซมเบลอร์ที่มีไวยากรณ์ใหม่จะไม่สามารถรวบรวมรหัสที่เขียนด้วยไวยากรณ์เก่า - ยกเว้นว่ารหัสนั้นจะไม่ใช้คำสั่งนั้น (และที่เดียวที่คุณจะเห็นรหัสแอสเซมบลีที่ไม่ได้ใช้MOVอยู่ในตัวอย่างไวยากรณ์ ที่แสดงคำแนะนำอื่น ๆ ... )

คอมไพเลอร์มักจะสร้างรหัสแอสเซมบลีและส่งผ่านไปยังแอสเซมเบลอร์โดยอัตโนมัติดังนั้นพวกเขาจะต้องแก้ไขเช่นกันเพื่อให้พอดีกับแอสเซมเบลอร์ใหม่ หากภาษาอนุญาตให้มีการประกอบแบบอินไลน์ซอร์สโค้ดเก่าที่ใช้แอสเซมเบลอร์แบบอินไลน์พร้อมMOVคำแนะนำจะไม่ทำงานอีกต่อไป

ดังนั้นเรากำลังพูดถึงการแตกรหัสขนาดใหญ่และเพื่ออะไร มันจะไม่ทำให้ภาษาใด ๆ อ่านได้มากขึ้นเพราะไม่เหมือนบางภาษาระดับสูงที่คุณมีโอกาสที่จะบอกสิ่งที่เป็นรหัสการชุมนุมไม่โดยไม่ทราบว่าการชุมนุมไม่และถ้าคุณรู้ว่าการชุมนุมที่คุณรู้ว่าสิ่งที่MOVทำ

ค่าใช้จ่ายมหาศาลด้วยการได้ศูนย์เป็นเรื่องง่ายอธิบายว่าทำไมคำสั่งไม่ได้ถูกเปลี่ยนชื่อ


3
คำถามนี้ถามคำถามนี้อย่างไร
ริ้น

2
ประโยคเดียวที่ลงท้ายด้วยเครื่องหมายคำถามคือ 'แต่ทำไมมันยังใช้กันอย่างแพร่หลายและไม่ถูกแทนที่ด้วย "คัดลอก" หรือ "เก็บ"?'
Idan Arye

2
มันไม่ได้อธิบายว่าทำไมการเรียนการสอนจึงได้รับการตั้งชื่อเช่นนี้เพื่อเริ่มต้นด้วย ISA นับไม่ถ้วนที่ออกแบบมาตั้งแต่ต้น (เช่นไม่มีข้อ จำกัด ด้านความเข้ากันได้ย้อนหลัง) มานานหลายทศวรรษ นอกจากนี้หากผู้ขายต้องการเปลี่ยนเครื่องช่วยจำแม้จะใช้งานร่วมกันได้แบบย้อนหลังพวกเขาสามารถให้นามแฝงและส่งเสริมการใช้งาน

1
"OP" หมายถึงอะไร และฉันไม่ได้เห็นคำอธิบายที่แท้จริง
Netch

1
ฉันเป็นโปสเตอร์ดั้งเดิมและฉันจะระบุว่าการคัดลอกระหว่างเซลล์หน่วยความจำใน S / 360 ไม่ใช่ "การทำงานที่แตกต่างกันเล็กน้อย" แต่เป็นกรณีพิเศษของการคัดลอกเดียวกันเท่านั้น คำถามยังไม่ได้รับการแก้ไข
Netch
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.