สิ่งที่ทำให้ฉันสับสนอยู่เสมอคือคอมพิวเตอร์ 8 บิตเข้าถึง RAM มากกว่า 256 ไบต์ได้อย่างไร ฉันรู้ว่ามันต้องใช้สองรีจิสเตอร์ แต่ใครช่วยแสดงตัวอย่างให้ฉันเห็นหน่อยว่าสิ่งนี้จะเป็นอย่างไรในโค้ดแอสเซมบลี?
ชอบ:
mov a, [x] ???
สิ่งที่ทำให้ฉันสับสนอยู่เสมอคือคอมพิวเตอร์ 8 บิตเข้าถึง RAM มากกว่า 256 ไบต์ได้อย่างไร ฉันรู้ว่ามันต้องใช้สองรีจิสเตอร์ แต่ใครช่วยแสดงตัวอย่างให้ฉันเห็นหน่อยว่าสิ่งนี้จะเป็นอย่างไรในโค้ดแอสเซมบลี?
ชอบ:
mov a, [x] ???
สมมติว่าเรามีที่อยู่ครึ่งหนึ่งและสูงกว่า 8 บิตในรีจิสเตอร์ L และ H ตัวอย่างเช่น เราต้องการอ่านไบต์จากที่อยู่ 32770 dec = 8002 hex
mov l, 02h ;lower byte of address
mov h, 80h ;higher byte of address
mov a, [hl] ;a <-- [h*256 + l]
โหมดการกำหนดแอดเดรสจำนวนมากมีอยู่ใน CPU ดังนั้นเราจึงมีตัวอย่างที่แตกต่างออกไป เช่น ด้วยการลงทะเบียนเพียงครั้งเดียวและที่อยู่ทันที:
mov h, 80h
mov a, [2] ;a <-- [h*256 + immediate]
ขึ้นอยู่กับสถาปัตยกรรม CPU เฉพาะเสมอ ตัวอย่างเช่น Zilog Z80 เรียกว่า CPU 8 บิต แต่ก็มีคำสั่ง 16 บิตมากมายเช่นกัน คุณสามารถจัดทำดัชนีที่อยู่ได้ดังนี้:
mov ix, 8002h ;base address of an array
mov a,[ix+20] ;a <-- [ix + 20] i.e. read a byte from an array like ix[20] in C
หมายเหตุ: CPU 8 บิตเก่าเหล่านั้นใช้ตัวสะสม 8 บิต กล่าวคือ พวกเขาสามารถคำนวณคณิตศาสตร์และคณิตศาสตร์อื่นๆ ได้เฉพาะในรีจิสเตอร์ 8 บิตเท่านั้น ดังนั้นจึงเป็น 8 บิตในระดับการคำนวณซอฟต์แวร์ . และหน่วยการเข้าถึงหน่วยความจำคือ 8 บิต กล่าวคือ สามารถอ่านหรือเขียนหน่วยความจำได้ครั้งละหนึ่งไบต์ ดังนั้นจึงเป็น 8 บิตในระดับฮาร์ดแวร์ด้วย คำสั่งแบบ 16 บิตนั้นช้า แต่จริง ๆ แล้วพวกมันทำการดำเนินการแบบ 8 บิตสองชุดติดต่อกัน
ลองพิจารณาว่า 8080 (Z80 ฯลฯ) มีรีจิสเตอร์ 8 บิต แต่สามารถจับคู่รีจิสเตอร์ให้ทำหน้าที่เหมือนรีจิสเตอร์ 16 บิตได้ คู่ที่ใช้มากที่สุดน่าจะเป็น HL ซึ่งก็คือ H สำหรับ 8 บิตสูงและ L สำหรับ 8 บิตล่างของที่อยู่ คู่รีจิสเตอร์อื่นๆ คือ BC และ DE -- อีกครั้ง คำสั่งส่วนใหญ่จะทำงานกับรีจิสเตอร์ของคู่นั้นครั้งละหนึ่งรายการเท่านั้น แต่มีเพียงไม่กี่คู่ที่สามารถใช้คู่ร่วมกันเพื่อทำงานกับปริมาณ 16 บิต (เช่น อย่างน้อยถ้าหน่วยความจำให้บริการ มีอันหนึ่งให้เพิ่ม DE ให้กับ HL)
คำแนะนำบางอย่างอาจใช้ที่อยู่ 16 บิตได้โดยตรง:
jmp 01234h
6502 มีลักษณะคล้ายกัน แต่จำกัดคำสั่งบางอย่างในการทำงานกับ RAM 256 ไบต์แรก (หรือที่เรียกว่า "หน้า 0") เวอร์ชันที่ใหม่กว่า (65816?) รองรับการเลือกที่อยู่ทางกายภาพที่แตกต่างกันซึ่งจะถือเป็นหน้า 0
REP $30
) มันมีการลงทะเบียน D
IIRC ซึ่งมันรวมกับ X หรือ Y เพื่อสร้างที่อยู่ 24 บิต
- person cHao; 03.12.2012
มีเทคนิคมากมายในการบรรลุเป้าหมายนี้
Intel 8080 เป็น CPU 8 บิตที่มี 2 รีจิสเตอร์ H และ L สำหรับที่อยู่ทางอ้อม ทำให้สามารถจัดการกับหน่วยความจำ 16 บิตได้ 16 บิต 8086 มีที่อยู่ 20 บิตพร้อมการแบ่งส่วน 80286 ใช้ที่อยู่ 24 บิตที่มีส่วนสูง 16 บิตเป็นดัชนีลงในตารางตัวอธิบายส่วน x86 แบบ 32 บิตใช้ที่อยู่ 36 บิตกับ PAE...
ไมโครคอนโทรลเลอร์ PIC มีค่า 8 บิตในรีจิสเตอร์ที่ผสานกับบิตสูงในพีซี (หรือรีจิสเตอร์ที่อยู่เฉพาะบางตัวตามที่ฉันจำไม่ได้) เพื่อสร้างที่อยู่ 13 บิต (หรือมากกว่านั้น ขึ้นอยู่กับสถาปัตยกรรม)
วิธีทั่วไปอีกวิธีหนึ่งในไมโครคอนโทรลเลอร์ (สถาปัตยกรรมไมโครโปรเซสเซอร์บางตัว) คือ การธนาคาร ซึ่งคุณเปลี่ยน "หน่วยความจำ" window" ที่ CPU สามารถมองเห็นได้ทุกครั้ง
สำหรับข้อมูลเพิ่มเติม คุณสามารถอ่านที่นี่
6502 มีคำแนะนำการอ่านหน่วยความจำที่จัดทำดัชนี lda $01200,Y
และ lda $1413,X
โดยที่ที่อยู่ 16 บิตถูกเข้ารหัสเป็นส่วนหนึ่งของคำสั่ง เมื่อใดก็ตามที่คำสั่งประเภทนั้นเห็นหน้าต่างขนาด 256 ไบต์ เพื่อเข้าถึง 256 ไบต์ถัดไป คำสั่งเองก็ได้รับการแก้ไขให้อ่าน lda $1300,Y
เป็นต้น
จากนั้น 8086 ก็มีสถาปัตยกรรมแบบแบ่งส่วน โดยที่การเข้าถึงหน่วยความจำทุกครั้งจะเชื่อมโยงกับการลงทะเบียนเซ็กเมนต์โดยนัยหรือชัดเจน mov reg,[bp]
และ push/pop
เชื่อมโยงกับส่วนของสแต็ก ss, [rep] movs
เชื่อมโยงกับ ds:[si], es:[di]; ตัวนับ / การกระโดดของโปรแกรมสัมพันธ์กับส่วนของโค้ด cs
ที่อยู่ทางกายภาพอยู่ในโหมด 8086 ซึ่งคำนวณเป็น stack_reg * 16 + offset โดยที่การพยายามอ่านคำที่ seg_reg:[ffff] ทำให้เกิดข้อยกเว้นการละเมิดส่วน
กราฟิก VGA ในสถาปัตยกรรม 8086 ถูกนำมาใช้พร้อมกับการแมปหน่วยความจำส่วน 64k กับ ISA-bus นอกจากนี้ ด้วยการตั้งโปรแกรมฮาร์ดแวร์ผ่านคำแนะนำเข้า / ออก ทำให้สามารถเลือก หน้า 64-k อื่นที่บอร์ดกราฟิกได้ ดังนั้นจึงเป็นไปได้ที่จะก้าวข้ามขีดจำกัด VGA สี 320x200 x 256 ไปเป็น 640x480 SVGA