You are on page 1of 8

Machine Translated by Google

การเขียนโปรแกรมแบบ 2
ก. บทนํ

วัตถุ
ประสงค์

ในตอนท้
ายของห้
องทดลองนี คุ
ณ ควรจะสามารถ:

ใช้
โหมดการระบุ
ทีอยูโ่ ดยตรงในการเข้
าถึ
งข้
อมูลในหน่วยความจํ

ใช้
โหมดการระบุ
ทีอยูโ่ ดยอ้
อมในการเข้
าถึ
งข้
อมูลในหน่วยความจํ

เขียนรูทีนย่อยและเรียกใช้

ส่งพารามิเตอร์ไปยังรูทีนย่อย

ข. ตัวจํ
าลองโปรเซสเซอร์ (
CPU)

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

ค. ทฤษฎีพนฐาน

โมเดลการเขียนโปรแกรมของสถาปตยกรรมคอมพิวเตอร์กํ
าหนดส่วนประกอบทางสถาปตยกรรมระดับตํ
าเหล่านัน ซึ
งรวมถึ
งสิงต่อไปนี

ชุ
ดคํ
าสังซีพย
ี ู

CPU ลงทะเบียน
วิธต
ี ่างๆ ในการระบุ
คํ
าสังและข้
อมูลในคํ
าสัง เช่น การระบุ
ทีอยู่
โหมดเช่นทีอยูโ่ ดยตรงและโดยอ้
อม

พวกเขายังกํ
าหนดปฏิสม
ั พันธ์ระหว่างองค์ประกอบข้
างต้
น เปนรูปแบบการเขียนโปรแกรมระดับตํ
าซึ
งทํ
าให้
สามารถคํ
านวณโปรแกรมได้

D. รายละเอียดเครืองจํ
าลอง

คุ
ณ สามารถค้
นหารายละเอียดของโปรแกรมจํ
าลองทีเกียวข้
องกับบทช่วยสอนนีได้
ในบทช่วยสอน Programming Model 1
ด้
วยเหตุ
นี สิงเหล่านีจะไม่เกิดขึ
นซํ
าทีนี ยกเว้
นข้
อมูลใหม่เกียวกับวิธด
ี แ
ู ละเข้
าถึ
งมุ
มมองหน่วยความจํ
าข้
อมูลโปรแกรม บทช่วยสอนนีจํ
าเปนต้
องเข้
าถึ

ส่วนนีของตัวจํ
าลอง
คุ
ณ จะพบรายละเอียดด้
านล่าง

1
Machine Translated by Google

มุ
มมองหน่วยความจํ
าข้
อมูลโปรแกรม

ภาพที 1 - มุ
มมองโปรแกรมหน่วยความจํ
าข้
อมูล

คํ
าสัง CPU ทีเข้
าถึ
งส่วนนันของหน่วยความจํ
าทีมีขอ
้มูลสามารถเขียนหรืออ่านข้
อมูลในตํ
าแหน่งทีอยูไ่ ด้
ข้
อมูลนีสามารถเห็
นได้
ในหน้
าต่างหน้
าหน่วยความ
จํ
าทีแสดงในภาพที 1 ด้
านบน
คุ
ณ สามารถแสดงหน้
าต่างนีได้
โดยคลิก ปุ
ม แสดงหน่วยความจํ
าข้
อมูลโปรแกรม... ในหน้
าต่าง CPU หลัก คอลัมน์ Ladd (
ทีอยูท
่ างตรรกะ)แสดงทีอยูเ่ ริม
ต้
นของแต่ละบรรทัดในการแสดงผล แต่ละบรรทัดของจอแสดงผลแทนข้
อมูล 8 ไบต์ คอลัมน์ B0 ถึ
ง B7 แทนไบต์ 0 ถึ
ง 7 ในแต่ละบรรทัด
คอลัมน์ Data แสดงอักขระทีแสดงได้
ซงตรงกั
ึ บ 8 ไบต์ ไบต์ทีสอดคล้
องกับอักขระทีไม่สามารถแสดงได้
จะแสดงเปนจุ
ด ไบต์ขอ
้มูลจะแสดงในรูปแบบ
เลขฐานสิบหกเท่านัน ตัวอย่างเช่น ในรูปภาพที 1 มีไบต์ขอ
้มูลทีไม่เปนศูนย์ในตํ
าแหน่งทีอยู่ 19 และ 37 ไบต์ขอ
้มูลเหล่านีสอดคล้
องกับอักษรตัวพิมพ์ใหญ่
A และ B ทีแสดงผลได้

หากต้
องการเปลียนค่าของไบต์ด้
วยตนเอง ขันแรกให้
เลือกบรรทัดทีมีไบต์นัน จากนันใช้
ขอ
้มูลใน เฟรม Initialize Data เพือแก้
ไขค่าของไบต์ในบรรทัดที
เลือกเปน รูปแบบ จํ
านวนเต็
ม บูลี น หรือ สตริง คุ
ณ ต้
องคลิก ปุ
ม UPDATE เพือทํ
าการเปลียนแปลง

2
Machine Translated by Google

แบบฝกหัด E. Lab - ตรวจสอบและสํ


ารวจ
ปอนคํ
าแนะนํ
าทีคุ
ณ สร้
างขึ
นเพือตอบคํ
าถามในกล่องว่าง โปรดดูภาคผนวกท้
ายเอกสารนีเพือดูรายละเอียดเกียวกับคํ
าแนะนํ
าทีต้
องการ คุ
ณ ต้
อง
ดํ
าเนินการตามคํ
าแนะนํ
าทีคุ
ณ สร้
างบนเครืองจํ
าลองเพือยืนยันคํ
าตอบของคุ

A. คํ
าแนะนํ
าในการเขียนและอ่านจากหน่วยความจํ
า(
RAM)
:

1. ค้
นหาคํ
าสังที เก็
บ ไบต์ในหน่วยความจํ
าข้
อมูลโปรแกรม และใช้
เพือเก็
บหมายเลข 65 ในตํ
าแหน่งแอดเดรสหน่วยความจํ
า 20 (
ใช้
วิธรี ะบุ
แอดเดรส
หน่วยความจํ
าโดยตรง )

2. ย้
ายหมายเลข 51 ไปทีทะเบียน R04 ใช้
คํ
าสัง store เพือ จัดเก็
บ เนือหาของ R04 ในตํ
าแหน่งหน่วยความจํ
าข้
อมูลโปรแกรม 21 (
วิธน
ี ีใช้
วิธก
ี าร
ระบุ
ทีอยู่ โดยตรงของรีจส
ิ เตอร์ )

3. ย้
ายหมายเลข 22 ไปทีทะเบียน R04 ใช้
ขอ
้มูลนีเพือ จัดเก็
บ หมายเลข 59 ทางอ้
อมในหน่วยความจํ
าข้
อมูลโปรแกรม (
คํ
าแนะนํ
า: คุ
ณ จะต้
องใช้
คํ
านํ
าหน้
า'
@'สํ
าหรับสิงนี – ดูรายการคํ
าแนะนํ
าในภาคผนวก)- (
วิธน
ี ีใช้
วธ
ิ ก
ี ารระบุ
ทีอยูท
่ างอ้
อมของการลง ทะเบียน )

4. ค้
นหาคํ
าสังที โหลด ไบต์จากหน่วยความจํ
าข้
อมูลโปรแกรมลงในรีจส
ิ เตอร์ ใช้
สงนี
ิ เพือโหลดหมายเลขในทีอยูห
่ น่วยความจํ
า 22 ลงในรีจส
ิ เตอร์ R10

5. เขียนลูปทีเขียน 10 ตัวเลขจาก 41 ถึ
ง 50 ในหน่วยความจํ
าข้
อมูลโปรแกรม
เริมจากทีอยูห
่ น่วยความจํ
า 24 (
คํ
าใบ้
: ใช้
การระบุ
ทีอยู่ ทางอ้
อมของรีจส
ิ เตอร์ โดยทีรีจส
ิ เตอร์ R04 แสดงถึ
งทีอยูห
่ น่วยความจํ
าโดยอ้
อมทีจะ
เขียนถึ
ง และเพิมทีอยูเ่ พือเพิมตํ
าแหน่งหน่วยความจํ
า)

6. เริมต้
นส่วนหนึ
งของหน่วยความจํ
าข้
อมูลโปรแกรมด้
วยตนเองโดยเริมจากทีอยู่ 40 ด้
วยสตริง “CPU INSTRUCTIONS RULE” (
ดูสว่ น D ด้
าน
บนเกียวกับวิธก
ี ารทํ
าเช่นนี)เขียนลูปทีสตริงนีถูกคัดลอกไปยังส่วนอืนของหน่วยความจํ
าข้
อมูลโปรแกรมโดยเริมจากทีอยู่ 64

3
Machine Translated by Google

B. คํ
าแนะนํ
าสํ
าหรับการเรียกรูทีนย่อยและการส่งพารามิเตอร์ไปยังรูทีนย่อย:

1. เพิมรหัสต่อไปนีและเรียกใช้
โดยเริมจากคํ
าสัง MOV แรก (
โดยคุ

ต้
องเลือกคํ
าสังนีก่อนแล้
วจึ
งคลิกทีปุ
ม RUN)

บันทึ
ก:

ถามผูส
้อนของคุ
ณ ถึ
งวิธเี พิมปายกํ
ากับในรหัสของคุ
ณ ปายกํ
ากับแสดงทีอยูข
่ องคํ
าแนะนํ
าทีอยูถ
่ ัดจากนัน ตัวอย่างเช่น '
Label2'
ด้
านล่างแสดงถึ
งทีอยูข
่ องคํ
าสัง MOV ทีตามมา คํ
าสังข้
ามใช้
ปายกํ
ากับโดยใส่ '
$'ไว้
หน้
าชือปายกํ
ากับ เช่น คํ
าสัง '
JMP $Label2'จะข้
ามไป
ยังคํ
าสังทีอยูท
่ ีแสดงโดยปายกํ
ากับ '
Label2'

ปายกํ
ากับ2
บันทึ
ก:
MOV #16,R03
MOV #h41,R04 รหัสนีเก็
บตัวเลขฐานสิบหก 41 ถึ
งฐานสิบหก 4F เริมต้
นจากทีอยูห
่ น่วยความจํ

ปายกํ
ากับ3 โปรแกรม 16 ตัวเลขเหล่านีเปนรหัส ASCII สํ
าหรับอักขระทีแสดงได้
ของตัวอักษร
STB R04,@R03 คุ
ณ ต้
องเข้
าใจว่าโค้
ดนีทํ
างานอย่างไรจึ
งจะได้
รบ
ั ประโยชน์จากแบบฝกหัดเหล่านี
เพิม #1,R03
เพิม #1,R04
CMP #h4F,R04
JNE $Label3
HLT

ก. จดบันทึ
กสิงทีคุ
ณ เห็
นในพืนทีข้
อมูลของโปรแกรมหลังจากทีโปรแกรมหยุ
ดทํ
างาน:

ข. แนะนํ
าว่า @ ใน @R03 มี ความสํ
าคัญอย่างไร :

2. เพิมโค้
ดเรียกรูทีนย่อยต่อไปนี แต่อย่า เพิง เรียกใช้
:

มศว
CAL $Label2
HLT

ตอนนีแปลงโค้
ดใน (
1)ด้
านบนเปนรูทีนย่อยโดยแทนที คํ
าสัง HLT ด้
วย คํ
าสัง RET

ก. จดบันทึ
กเนือหาของ PROGRAM STACK หลังจาก ดํ
าเนิน การคํ
าสัง MSF
(
คุ
ณ สามารถดํ
าเนินการตามคํ
าสังนีได้
โดยดับเบิลคลิก)
:

ข. จดบันทึ
กเนือหาของ PROGRAM STACK หลังจาก ดํ
าเนิน การคํ
าสัง CAL
(
คุ
ณ สามารถดํ
าเนินการตามคํ
าสังนีได้
โดยดับเบิลคลิก)
:

4
Machine Translated by Google

ค. ความสําคัญของข้
อมูลเพิมเติมในสแต็
กหลังจากดํ
าเนินการ CAL คืออะไร
คําแนะนํา?

3. มาทํ
าให้
รูทีนย่อยด้
านบนยืดหยุ

่ ขึ
นเล็
กน้
อย สมมติวา่ เราต้
องการเปลียน
จํ
านวนอักขระทีเก็
บไว้
เมือเรียกใช้
รูทีนย่อย แก้
ไขรหัสการโทรใน (
2)ดังต่อไปนี:

มศว
PSH #h60 วางเลขฐานสิบหก 60 ไว้
บนสุ
ดของสแต็

CAL $Label2
HLT

ก. ตอนนีแก้
ไขรหัสรูทีนย่อยใน (
1)ตามด้
านล่างและเรียกใช้
รหัสการโทรด้
านบน (
เริมจาก
คํ
า สัง MSF )ให้
ความสนใจเปนพิเศษกับพฤติกรรมของสแต็
ก:

ปายกํ
ากับ2

MOV #16,R03
MOV #h41,R04
POP R05 วางตัวเลขไว้
ด้
านบนของสแต็
กใน R05
ปายกํ
ากับ3

STB R04,@R03
เพิม #1,R03
เพิม #1,R04
CMP R05,R04 เปรียบเทียบ R05 กับ R04
JNE $Label3
ร.ฟ.ท

ข. เพิมพารามิเตอร์ตัวทีสองให้
กับโค้
ดด้
านบนทีสามารถระบุ
ทีอยูเ่ ริมต้
นทีแตกต่างกันสํ
าหรับการถ่ายโอนข้
อมูลไปยังหน่วยความจํ
า และทดสอบบน
ตัวจํ
าลอง เขียนรหัสทีแก้
ไขด้
านล่าง:

5
Machine Translated by Google

4. เขียนรูทีนย่อยทีรับตัวเลขสองตัวเปนพารามิเตอร์ บวกกันแล้
วส่งคืนผลลัพธ์ในรีจส
ิ เตอร์ R00 นันคือเมือออกจากรูทีนย่อย ผลลัพธ์จะพร้
อมใช้
งานใน R00 กับส่วนทีเหลือของโปรแกรม ทดสอบบนเครืองจํ
าลองโดยเขียนคํ
าสังการโทรทีรวมการส่งผ่านตัวเลขสองตัวบนสแต็
ก คัดลอก
รหัสด้
านล่าง (
รวมถึ
งคํ
าแนะนํ
าในการโทร)
:

5. เขียนรูทีนย่อยทีรับตัวเลขสองตัวเปนพารามิเตอร์ เปรียบเทียบและส่งคืนค่าทีสูงกว่าของทังสองเปนผลลัพธ์ในรีจส
ิ เตอร์ R00 (
พิจารณาว่าจะ
เกิดอะไรขึ
นหากตัวเลขทังสองเหมือนกัน)ทดสอบบนเครืองจํ
าลองโดยเขียนคํ
าสังการโทรทีรวมการส่งผ่านตัวเลขสองตัวบนสแต็

คัดลอกรหัสรูทีนย่อยเพียงอย่างเดียวด้
านล่าง:

6
Machine Translated by Google

ภาคผนวก - ชุ
ดย่อยคํ
าสัง Simulator

Inst. คํ
าอธิบาย
คํ
าแนะนํ
าในการถ่ายโอนข้
อมูล

ย้
ายข้
อมูลเพือลงทะเบียน ย้
ายทะเบียนไปจด

เอ็
มโอวี เช่น
MOV #2,R01 ย้
ายหมายเลข 2 ไปยัง register R01 MOV R01,R03
ย้
ายเนือหาของ register R01 ไปยัง register R03 โหลดหนึ
งไบต์จากหน่วยความจํ
าเพือลง
ทะเบียน
แอลดีบ ี เช่น
LDB 1022,R03 โหลดไบต์จากทีอยูห
่ น่วยความจํ
า 1022 ลงใน R03 LDB @R02,R05 โหลดไบต์
จากหน่วยความจํ
าทีอยูใ่ น R02 LDW โหลดคํ
า(2 ไบต์)จากหน่วยความจํ
าเพือลงทะเบียน เช่นเดียวกับใน LDB แต่

คํ
า (เช่น 2 ไบต์)ถูกโหลดลงในรีจส
ิ เตอร์ เก็
บไบต์จากรีจส
ิ เตอร์ไปยังหน่วยความจํ

STB R07,2146 เก็
บไบต์จาก R07 ลงในทีอยูห
่ น่วยความจํ
า 2146 STB R04,@R08 เก็
บไบต์
จาก R04 ลงในทีอยูห
่ น่วยความจํ
าซึ
งอยูใ่ น R08

สธ

STW เก็
บคํ
า(2 ไบต์)จากรีจส
ิ เตอร์ไปยังหน่วยความจํ
า เหมือนกับใน STB แต่มก
ี ารโหลด
คํ
า(เช่น 2 ไบต์)เก็
บไว้
ในหน่วยความจํ
า พุ
ชข้
อมูลไปทีด้
านบนของสแตกฮาร์ดแวร์ (
TOS)กดลงทะเบียน
ไปที TOS

ป.ล เช่น
PSH #6 ดันหมายเลข 6 ไปทีด้
านบนของสแต็
ก PSH R03 ดันเนือหา
ของรีจส
ิ เตอร์ R03 ไปทีด้
านบนของสแต็
ก ปอปข้
อมูลจากด้
านบนของฮาร์ดแวร์สแต็
กเพือลงทะเบียน

เช่น
โผล่
POP R05 แสดงเนือหาด้
านบนของสแต็
กลงในรีจส
ิ เตอร์ R05 หมายเหตุ
: หากคุ

พยายาม POP จากสแต็
กว่าง คุ
ณ จะได้
รบ
ั ข้
อความแสดงข้
อผิดพลาด "
Stack underflow"

คํ
าแนะนํ
าทางคณิตศาสตร์
เพิมหมายเลขเพือลงทะเบียน เพิมการลงทะเบียนเพือลงทะเบียน
เช่น
เพิม เพิม #3,R02 เพิมหมายเลข 3 ในเนือหาของการลงทะเบียน R02 และเก็
บผลลัพธ์ไว้
ในการลงทะเบียน R02

เพิม R00,R01 เพิมเนือหาของรีจส


ิ เตอร์ R00 ไปยังเนือหาของรีจส
ิ เตอร์ R01 และเก็
บผลลัพธ์ไว้
ในรีจส
ิ เตอร์
R01
ย่อย
ลบหมายเลขออกจากทะเบียน ลบการลงทะเบียนออกจากการลงทะเบียน

มัล
คูณ เลขด้
วยรีจส
ิ เตอร์ คูณ ลงทะเบียนกับลงทะเบียน

หารด้
วยทะเบียน; แบ่งการลงทะเบียนกับการลงทะเบียน
กรมทรัพย์สน
ิ ทางปญญา

ควบคุ
มคํ
าแนะนํ
าการถ่ายโอน

ข้
ามไปยังทีอยูค
่ ํ
าแนะนํ
าโดยไม่มเี งือนไข

จ.ส.อ เช่น
JMP 100 ข้
ามไปยังตํ
าแหน่งทีอยู่ 100 อย่างไม่มเี งือนไขซึ
งมีคํ
าสังอืน

7
Machine Translated by Google

จลท
ข้
ามไปยังทีอยูค
่ ํ
าแนะนํ
าหากน้
อยกว่า (
หลังจากการเปรียบเทียบครังล่าสุ
ด)

จขกท
ข้
ามไปยังทีอยูค
่ ํ
าแนะนํ
าหากมากกว่า (
หลังจากการเปรียบเทียบครังล่าสุ
ด)

ข้
ามไปยังทีอยูค
่ ํ
าสังถ้
าเท่ากัน (
หลังจากคํ
าสังเปรียบเทียบล่าสุ
ด)
เช่น
เจ.อี.คิว
JEQ 200 ข้
ามไปยังตํ
าแหน่งทีอยู่ 200 หากผลลัพธ์ของคํ
าสังเปรียบเทียบก่อนหน้
านีระบุ
วา่ ตัวเลขทังสอง
มีค่าเท่ากัน นันคือ Z
มีการตังค่าสถานะ (กล่อง Z จะถูกตรวจสอบในกรณีนี)
เจเอ็
นอี
ข้
ามไปยังทีอยูค
่ ํ
าแนะนํ
าหากไม่เท่ากัน (
หลังจากการเปรียบเทียบครังล่าสุ
ด)

คํ
าสัง Mark Stack Frame ใช้
รว่ มกับคํ
าสัง CAL

มศว เช่น
MSF สงวนพืนทีสํ
าหรับทีอยูผ
่ ส
ู้ง
่ บนสแต็
กโปรแกรม
CAL 1456 บันทึ
กทีอยูผ
่ ส
ู้ง
่ ในพืนทีสงวนไว้
และข้
ามไปยังรูทีนย่อยในตํ
าแหน่งทีอยู่ 1456

ข้
ามไปยังทีอยูร่ ูทีนย่อย (
บันทึ
กทีอยูผ
่ ส
ู้ง
่ บนสแต็
กโปรแกรม)

แคล คํ
าสังนีใช้
รว่ มกับ คํ
าสัง MSF คุ
ณ ต้
องใช้
คํ
าสัง MSF ก่อนคํ
าสัง CAL ดูตัวอย่างด้
านบน

ร.ฟ.ท
ส่งคืนจากรูทีนย่อย (
ใช้
ทีอยูผ
่ ส
ู้ง
่ บนสแต็
ก)

สว
ซอฟต์แวร์ขด
ั จังหวะ (
ใช้
เพือขอความช่วยเหลือจากระบบปฏิบต
ั ิการ)

HLT
หยุ
ดการจํ
าลอง

คํ
าสังเปรียบเทียบ
เทียบเบอร์กับรีจส
ิ เตอร์ เปรียบเทียบการลงทะเบียนกับการลงทะเบียน
เช่น
CMP #5,R02 เปรียบเทียบหมายเลข 5 กับเนือหาของการลงทะเบียน R02
CMP R01,R03 เปรียบเทียบเนือหาของการลงทะเบียน R01 และ R03

ซี.เอ็
ม.พี
บันทึ
ก:

ถ้
า R01 = R03 สถานะสถานะ Z จะถูกตังค่า นันคือ กล่อง Z ถูกทํ
าเครืองหมายไว้
ถ้
า R01 < R03 จะไม่มก
ี ารตังค่าแฟล็
กสถานะใดเลย กล่าวคือไม่มก
ี ารเลือกแฟล็
กบ็
อกซ์สถานะใด

ถ้
า R01 > R03 แฟล็
กสถานะ จะถูกตังค่า นันคือ ช่อง สถานะ N จะถูก เลือก

คํ
าสังอินพุ
ต,เอาท์พุ

ใน
รับข้
อมูลอินพุ
ต(ถ้
ามี)จากอุ
ปกรณ์ IO ภายนอก

ส่งข้
อมูลออกไปยังอุ
ปกรณ์ IO ภายนอก

ออก เช่น
OUT 16,0 ส่งออกเนือหาของข้
อมูลในตํ
าแหน่ง 16 ไปยังคอนโซล (
พารามิเตอร์ทีสองต้
องเปน 0 เสมอ)

You might also like