เนื้อหาส่วนใหญ่ของของคำตอบนี้เดิมมาจากคำตอบนี้ (เขียนก่อนที่คำถามอื่น ๆ ที่ถูกทำเครื่องหมายว่าซ้ำกัน) ดังนั้นฉันจึงหารือเกี่ยวกับการใช้ค่า 8 บิต (แม้ว่าคำถามนี้ถามเกี่ยวกับค่า 32- บิต) แต่ก็ไม่เป็นไรเพราะค่า 8 บิตนั้นง่ายกว่าที่จะเข้าใจแนวคิดและแนวคิดเดียวกันนี้ใช้กับค่าที่ใหญ่กว่าเช่นเลขคณิต 32 บิต
เมื่อคุณเพิ่มตัวเลขสองตัวที่เป็น 8 บิตจำนวนที่มากที่สุดที่คุณจะได้รับคือ (0xFF + 0xFF = 1FE) ในความเป็นจริงถ้าคุณคูณสองตัวเลขที่เป็น 8 บิตตัวเลขที่ใหญ่ที่สุดที่คุณจะได้รับ (0xFF * 0xFF = 0xFE01) ยังคงเป็น 16 บิตสองเท่าของ 8 บิต
ตอนนี้คุณอาจสมมติว่าตัวประมวลผล x-bit สามารถติดตาม x-bits ได้เท่านั้น (ตัวอย่างเช่นโปรเซสเซอร์ 8 บิตสามารถติดตาม 8 บิตเท่านั้น) นั่นไม่ถูกต้อง ตัวประมวลผล 8 บิตรับข้อมูลในกลุ่มแบบ 8 บิต (โดยทั่วไป "chunks" เหล่านี้มีคำที่เป็นทางการ: "word" ในตัวประมวลผล 8 บิตจะใช้คำ 8 บิตบนตัวประมวลผล 64 บิตสามารถใช้คำ 64 บิตได้)
ดังนั้นเมื่อคุณให้คอมพิวเตอร์ 3 ไบต์:
ไบต์ # 1: คำสั่ง MUL
ไบต์ # 2: ไบต์ลำดับสูง (เช่น 0xA5)
ไบต์ # 3: ไบต์ลำดับที่ต่ำกว่า (เช่น 0xCB)
คอมพิวเตอร์สามารถสร้างผลลัพธ์ที่ มากกว่า 8 บิต CPU อาจสร้างผลลัพธ์เช่นนี้:
0100 0000 0100 0010 xxxx xxxx xxxx 1101 0111
aka:
0x4082xxxxD7
ทีนี้ขอผมแปลมันให้คุณ:
0x หมายถึงเลขฐานสิบหกต่อไปนี้
ฉันจะหารือเกี่ยวกับ "40" ในรายละเอียดเพิ่มเติมในไม่ช้า
82 เป็นส่วนหนึ่งของการลงทะเบียน "A" ซึ่งเป็นชุดของ 8 บิต
xx และ xx เป็นส่วนหนึ่งของการลงทะเบียนอีกสองรายการชื่อการลงทะเบียน "B" และการลงทะเบียน "C" เหตุผลที่ฉันไม่ได้เติมบิตเหล่านั้นด้วยค่าศูนย์หรืออันใดอันหนึ่งก็คือคำสั่ง "เพิ่ม" (ส่งไปยัง CPU) อาจส่งผลให้บิตเหล่านั้นไม่เปลี่ยนแปลงตามคำสั่ง (ในขณะที่บิตอื่น ๆ ที่ฉันใช้ในตัวอย่างนี้อาจ รับการแก้ไขยกเว้นบิตแฟล็กบางตัว)
D7 จะพอดีกับบิตเพิ่มเติมเรียกว่า "D" register
การลงทะเบียนเป็นเพียงส่วนหนึ่งของหน่วยความจำ รีจิสเตอร์ถูกสร้างไว้ใน CPU ดังนั้น CPU สามารถเข้าถึงรีจิสเตอร์โดยไม่จำเป็นต้องโต้ตอบกับหน่วยความจำบน RAM stick
ดังนั้นผลลัพธ์ทางคณิตศาสตร์ของ 0xA5 คูณ 0xCB คือ 0x82D7
ทีนี้ทำไมเศษเล็กเศษน้อยถูกแบ่งออกเป็นรีจิสเตอร์ A และ D แทนที่จะรีจิสเตอร์ A และ B หรือรีจิสเตอร์ C และ D? นี่เป็นตัวอย่างสถานการณ์ที่ฉันใช้ซึ่งคล้ายกับแนวคิดในภาษาแอสเซมบลีที่แท้จริง (Intel x86 16 บิตซึ่งใช้โดย Intel 8080 และ 8088 และซีพียูรุ่นใหม่กว่า) อาจมีกฎทั่วไปบางอย่างเช่นการลงทะเบียน "C" โดยทั่วไปจะใช้เป็นดัชนีสำหรับการนับการดำเนินการ (โดยทั่วไปสำหรับลูป) และการลงทะเบียน "B" ที่ใช้ในการติดตามการออฟเซ็ตที่ช่วยระบุตำแหน่งหน่วยความจำ ดังนั้น "A" และ "D" อาจเป็นเรื่องธรรมดาสำหรับฟังก์ชันเลขคณิตทั่วไปบางอย่าง
คำสั่ง CPU แต่ละตัวควรมีเอกสารประกอบที่ใช้โดยบุคคลที่เขียนโปรแกรมในชุดประกอบ เอกสารนั้นควรระบุสิ่งที่ลงทะเบียนใช้โดยแต่ละคำสั่ง (ดังนั้นตัวเลือกเกี่ยวกับการลงทะเบียนที่จะใช้มักถูกระบุโดยผู้ออกแบบของ CPU ไม่ใช่โปรแกรมเมอร์ภาษาแอสเซมบลีแม้ว่าจะมีความยืดหยุ่นบ้าง)
ตอนนี้กลับไปที่ "40" ในตัวอย่างข้างต้นนั่นคือชุดของบิตที่มักจะเรียกว่า "การลงทะเบียนธง" แต่ละบิตในการลงทะเบียนสถานะมีชื่อ ตัวอย่างเช่นมีบิต "โอเวอร์โฟลว์" ที่ CPU อาจตั้งค่าหากผลลัพธ์มีขนาดใหญ่กว่าพื้นที่ที่สามารถเก็บหนึ่งไบต์ของผลลัพธ์ (บิต "ล้น" อาจถูกอ้างถึงโดยชื่อย่อของ "OF" นั่นคือทุน o ไม่ใช่ศูนย์) ซอฟต์แวร์สามารถตรวจสอบค่าของการตั้งค่าสถานะนี้และสังเกตเห็นปัญหา " การทำงานกับบิตนี้มักจะถูกจัดการอย่างล่องหนโดยภาษาระดับสูงกว่าดังนั้นผู้เริ่มต้นโปรแกรมเมอร์มักจะไม่เรียนรู้เกี่ยวกับวิธีการโต้ตอบกับค่าสถานะของ CPU อย่างไรก็ตามโปรแกรมเมอร์แอสเซมบลีอาจเข้าถึงค่าสถานะเหล่านี้บางอย่างในลักษณะคล้ายกับตัวแปรอื่น ๆ
ตัวอย่างเช่นคุณอาจมีคำแนะนำเพิ่มหลายรายการ คำสั่ง ADD หนึ่งคำสั่งอาจเก็บ 16 บิตของผลลัพธ์ใน A register และ D register ในขณะที่คำสั่งอื่นอาจเก็บ 8 low bits ในการลงทะเบียน A ละเว้นการลงทะเบียน D และระบุ overflow bit จากนั้นในภายหลัง (หลังจากเก็บผลลัพธ์ของการลงทะเบียน A ลงใน RAM หลัก) คุณสามารถใช้คำสั่ง ADD อื่นที่เก็บเพียง 8 บิตสูงในการลงทะเบียน (อาจเป็นการลงทะเบียน A) ไม่ว่าคุณจะต้องใช้ธงล้นอาจ ขึ้นอยู่กับคำสั่งการคูณที่คุณใช้
(นอกจากนี้ยังมีธง "underflow" โดยทั่วไปในกรณีที่คุณลบมากเกินไปเพื่อให้พอดีกับผลลัพธ์ที่ต้องการ)
เพื่อแสดงให้คุณเห็นว่าสิ่งต่าง ๆ มีความซับซ้อน:
Intel 4004 เป็นซีพียู 4 บิต
Intel 8008 เป็นซีพียู 8 บิต มีรีจิสเตอร์ 8 บิตชื่อ A, B, C และ D
Intel 8086 เป็นซีพียู 16 บิต มีรีจิสเตอร์ 16 บิตชื่อ AX, BX, CX และ DX
Intel 80386 เป็น CPU แบบ 32 บิต มีรีจิสเตอร์ 32 บิตชื่อ EAX, EBX, ECX และ EDX
Intel x64 CPUs มีการลงทะเบียน 64 บิตชื่อ RAX, RBX, RCX และ RDX ชิป x64 สามารถเรียกใช้รหัส 16 บิต (ในบางโหมดปฏิบัติการ) และสามารถตีความคำสั่ง 16 บิตได้ เมื่อทำเช่นนั้นบิตที่ประกอบขึ้นทะเบียน AX คือครึ่งหนึ่งของบิตที่ทำขึ้นทะเบียน EAX ซึ่งเป็นครึ่งหนึ่งของบิตที่ทำขึ้นทะเบียน RAX ดังนั้นเมื่อใดก็ตามที่คุณเปลี่ยนค่าของ AX คุณจะเปลี่ยน EAX และ RAX ด้วยเพราะบิตเหล่านั้นที่ใช้โดย AX นั้นเป็นส่วนหนึ่งของบิตที่ RAX ใช้ (ถ้าคุณเปลี่ยน EAX ด้วยค่าที่เป็นทวีคูณของ 65,536 ดังนั้น 16 บิตต่ำจะไม่เปลี่ยนแปลงดังนั้น AX จะไม่เปลี่ยนแปลงหากคุณเปลี่ยน EAX ด้วยค่าที่ไม่ใช่หลาย 65,536 นั่นก็จะส่งผลต่อ AX เช่นกัน .)
มีการตั้งค่าสถานะและการลงทะเบียนมากกว่าสิ่งที่ฉันได้กล่าวถึง ฉันเพียงแค่เลือกสิ่งที่ใช้กันทั่วไปเพื่อเป็นตัวอย่างของแนวคิดที่เรียบง่าย
ตอนนี้ถ้าคุณใช้ CPU 8 บิตเมื่อคุณเขียนไปยังหน่วยความจำคุณอาจพบข้อ จำกัด บางประการเกี่ยวกับความสามารถในการอ้างถึงที่อยู่ 8 บิตไม่ใช่ที่อยู่ 4 บิตหรือ 16 บิต รายละเอียดจะแตกต่างกันไปตามซีพียู แต่ถ้าคุณมีข้อ จำกัด เช่นนั้นซีพียูอาจมีคำศัพท์ 8 บิตซึ่งเป็นสาเหตุที่ทำให้ซีพียูมักถูกเรียกว่า "8 บิตซีพียู"