21
เอกสารคาสอนรายวิชา 2301274 ระบบคอมพิวเตอร์ คณะวิทยาศาสตร์ จุฬาลงกรณ์มหาวิทยาลัย | 131 บทที่ 12 การโปรแกรมแอลซีทรีโพรเซสเซอร์ วัตถุประสงค์ของการเรียนในบทนี เขียนโปรแกรมด้วยชุดคาสั ่งของแอลซีทรี อธิบายการทางานของการเรียกฟังก์ชัน (function call), การเรียกซ้า (recursive call), กับดัก (trap), การ ขัดจังหวะ (interrupt) ในบทนี ้เราจะมาเขียนโปรแกรมด ้วยชุดคาสั ่งของแอลซีทรีซึ ่งมีสถาปัตยกรรมชุดคาสั ่งที ่แตกต่างจากสแตกซีพียู โดยสิ ้นเชิง และยังมีอุปกรณ์รับอินพุตและแสดงเอาต์พุต เช่น คีย์บอร์ดและจอภาพ เนื ้อหาที ่เกี ่ยวกับแอลซีทรีส่วน ใหญ่เรียบเรียงจากหนังสือของ Patt และ Patel คือ Introduction to Computing Systems: From bits & gates to C & beyond, McGraw-Hill, 2003 นอกจากนี ้แบบฝึกหัดบางส่วนก็ประยุกต์มาจากหนังสือของ Patt และ Patel ในการฝึกเขียนโปรแกรมให้นิสิตดาวน์โหลด LC3 Simulator จากเว็บไซต์ของรายวิชา ภาษาแอสเซมบลีของแอลซีทรี ในบทที ่แล้วเราได้เห็นภาษาเครื ่อง (machine language) ของแอลซีทรีไปแล้ว แต่เวลาเขียนโปรแกรมเราจะใช้ ภาษาแอสเซมบลี (assembly language) แล้วค่อยใช้แอสเซมเบลอร์ (assembler) แปลให้เป็นภาษาเครื ่อง คาสั ่ง Add Register mode: ADD R0, R1, R2 ; R[0] = R[1] + R[2] Immediate mode: ADD R0, R1, #1 ; R[0] = R[1] + 1 คาสั ่ง And Register mode: AND R0, R1, R2 ; R[0] = R[1] & R[2] Immediate mode: AND R0, R1, #255 ; R[0] = R[1] & x0F คาสั ่ง Branch PC-relative mode: BRn A (label) ; PC += offset, if n=1 BRzp A (label) ; PC += offset, if z=p=1 คาสั ่ง Jump Register mode: JMP R0 ; PC = R[0] คาสั ่ง Jump Subroutine PC-relative mode: JSR A (label) ; R[7] = PC, PC += offset Register mode: JSSR R0 ; R[7] = PC, PC = R[0]

บทที่ 12pioneer.netserv.chula.ac.th/~achatcha/2301274/MyBook_12_LC3Programming.pdfบทที่ 12 ... 1 ชิ้นคือหน่วยความจ า 1 ช่อง

  • Upload
    others

  • View
    2

  • Download
    0

Embed Size (px)

Citation preview

Page 1: บทที่ 12pioneer.netserv.chula.ac.th/~achatcha/2301274/MyBook_12_LC3Programming.pdfบทที่ 12 ... 1 ชิ้นคือหน่วยความจ า 1 ช่อง

เอกสารค าสอนรายวชา 2301274 ระบบคอมพวเตอร คณะวทยาศาสตร จฬาลงกรณมหาวทยาลย | 131

บทท 12

การโปรแกรมแอลซทรโพรเซสเซอร

วตถประสงคของการเรยนในบทน

เขยนโปรแกรมดวยชดค าสงของแอลซทร

อธบายการท างานของการเรยกฟงกชน (function call), การเรยกซ า (recursive call), กบดก (trap), การ

ขดจงหวะ (interrupt)

ในบทน เราจะมาเขยนโปรแกรมดวยชดค าสงของแอลซทรซงมสถาปตยกรรมชดค าสงทแตกตางจากสแตกซพย

โดยสนเชง และยงมอปกรณรบอนพตและแสดงเอาตพต เชน คยบอรดและจอภาพ เนอหาทเกยวกบแอลซทรสวน

ใหญเรยบเรยงจากหนงสอของ Patt และ Patel คอ Introduction to Computing Systems: From bits & gates to

C & beyond, McGraw-Hill, 2003 นอกจากนแบบฝกหดบางสวนกประยกตมาจากหนงสอของ Patt และ Patel

ในการฝกเขยนโปรแกรมใหนสตดาวนโหลด LC3 Simulator จากเวบไซตของรายวชา

ภาษาแอสเซมบลของแอลซทร

ในบททแลวเราไดเหนภาษาเครอง (machine language) ของแอลซทรไปแลว แตเวลาเขยนโปรแกรมเราจะใช

ภาษาแอสเซมบล (assembly language) แลวคอยใชแอสเซมเบลอร (assembler) แปลใหเปนภาษาเครอง

ค าสง Add

Register mode: ADD R0, R1, R2 ; R[0] = R[1] + R[2]

Immediate mode: ADD R0, R1, #1 ; R[0] = R[1] + 1

ค าสง And

Register mode: AND R0, R1, R2 ; R[0] = R[1] & R[2]

Immediate mode: AND R0, R1, #255 ; R[0] = R[1] & x0F

ค าสง Branch

PC-relative mode: BRn A (label) ; PC += offset, if n=1

BRzp A (label) ; PC += offset, if z=p=1

ค าสง Jump

Register mode: JMP R0 ; PC = R[0]

ค าสง Jump Subroutine

PC-relative mode: JSR A (label) ; R[7] = PC, PC += offset

Register mode: JSSR R0 ; R[7] = PC, PC = R[0]

Page 2: บทที่ 12pioneer.netserv.chula.ac.th/~achatcha/2301274/MyBook_12_LC3Programming.pdfบทที่ 12 ... 1 ชิ้นคือหน่วยความจ า 1 ช่อง

เอกสารค าสอนรายวชา 2301274 ระบบคอมพวเตอร คณะวทยาศาสตร จฬาลงกรณมหาวทยาลย | 132

ค าสง Load

PC-relative mode: LD R0, A ; R[0] = M[PC + offset]

Indirect mode: LDI R0, A ; R[0] = M[M[PC+offset]]

Base+offset mode: LDR R0, R1, #1 ; R[0] = M[R[1] + 1]

ค าสง Load Effective Address

PC-relative mode: LEA R0, A ; R[0] = PC + offset

ค าสง Not

Register mode: NOT R0, R1 ; R[0] = ~R[1]

ค าสง Store

PC-relative mode: ST R0, A ; M[PC + offset] = R[0]

Indirect mode: STI R0, A ; M[M[PC+offset]] = R[0]

Base+offset mode: STR R0, R1, #1 ; M[R[1] + 1] = R[0]

ค าสง Return / Return from Interrupt / Trap to Subroutine

Register mode: RET ; PC = R[7]

Register mode: RTI ; PC = R[7], change mode

Immediate mode: TRAP x21 ; R[7] = PC, PC = M[x21]

ตวแปร (Variable)

ตวแปรจะประกาศไวในสวนทเรยกวา assembler directives เชน มตวแปร A กประกาศวา

A .BLKW 1

แตถาจะใหมคาเรมตนดวย เชน A = 1 กประกาศวา

A .FILL 0x0001

ถาไมใช assembler directives โปรแกรมเมอรจะตองจ าเอาเองวาตวแปรนนอยทเลขทอย (address) ใด การใช

assembler directives ท าใหอางถงเลขทอยของตวแปรไดงายๆ ดวยชอตวแปร เชน A, B, C เปนตน

แถวล าดบ (Array)

แถวล าดบกประกาศเหมอนตวแปรธรรมดา เพยงแตเพมจ านวนชองตามทตองการ เชน ถาตองการแถวล าดบ 3

ชองกประกาศวา

A .BLKW 3

แตถาจะใหมคาเรมตนดวย เชน A = {1, 2, 3} กประกาศวา

A .FILL 0x0001

.FILL 0x0002

.FILL 0x0003

ตวแปรแบบสายอกขระ (string) กเปนแถวล าดบแบบหนง แตละชองกคอตวอกขระ (character) เชน

S .STRINGZ “Hello, World!” กนท 14 ชอง ชองสดทายเปน null

Page 3: บทที่ 12pioneer.netserv.chula.ac.th/~achatcha/2301274/MyBook_12_LC3Programming.pdfบทที่ 12 ... 1 ชิ้นคือหน่วยความจ า 1 ช่อง

เอกสารค าสอนรายวชา 2301274 ระบบคอมพวเตอร คณะวทยาศาสตร จฬาลงกรณมหาวทยาลย | 133

กระโดด (Jump)

ถาตองการกระโดดจากบรรทดหนงเพอไปท างานยงอกบรรทดหนง กท าไดหลายแบบ เชน

BRnzp A ; กระโดดไปยง A

แตค าสง BRnzp จะกระโดดไปไดไมไกลกวา offset 9 บต (เปนสวนเตมเตมสอง) ท าใหจะกระโดดขนไปทาง

เลขทอย x0000 (offset เปนลบ) หรอกระโดดลงไปทางเลขทอย xFFFF (offset เปนบวก) ถาจะกระโดดไปไกล

กวานนกตองโหลดเลขทอย (address) ทจะกระโดดไปมาเกบไวในเรจสเตอรกอน เพราะเรจสเตอรมขนาด 16 บต

จะท าใหกระโดดไปไดไกลกวา

LD R0, A ; A ตองอยไมไกลจากบรรทดนมาก

JMP R0 ; กระโดดไปท 0x1000

… … …

A .FILL 0x1000

ค าสง if-then

โคดตามรปน เลย

รปท 12.1 โครงสรางโปรแกรมแบบ if-then

ค าสง if-else

โคดตามรปน เลย

รปท 12.2 โครงสรางโปรแกรมแบบ if-else

Page 4: บทที่ 12pioneer.netserv.chula.ac.th/~achatcha/2301274/MyBook_12_LC3Programming.pdfบทที่ 12 ... 1 ชิ้นคือหน่วยความจ า 1 ช่อง

เอกสารค าสอนรายวชา 2301274 ระบบคอมพวเตอร คณะวทยาศาสตร จฬาลงกรณมหาวทยาลย | 134

การสรางบตเงอนไข (Condition Bit)

ไมวาเราจะโปรแกรมเงอนไขอะไรกตามแอลซทรมบตเงอนไขเพยง 3 บตเทานน และค าสง BR จะท างาน

ตามบตเงอนไขเสมอ ดงนนเราตองแปลงเงอนไขของเราใหเขากบบตเงอนไขแลวคอยใชค าสง BR เชน

A = 0, A != 0 LD R0, A

BRz … ; branch taken if A = 0

BRnp … ; branch taken if A != 0

A >= 2 LD R1, A

ADD R0, R1, #-2

BRzp … ; branch taken if A – 2 >= 0

A > B LD R1, A

LD R2, B

NOT R2, R2

ADD R2, R2, #1

ADD R0, R1, R2

BRp … ; branch taken if A – B > 0

การท า for-loop

ท าเหมอนการโปรแกรมสแตกซพยดรปท 10.5

การท า while-loop

ท าเหมอนการโปรแกรมสแตกซพยดรปท 10.6

Page 5: บทที่ 12pioneer.netserv.chula.ac.th/~achatcha/2301274/MyBook_12_LC3Programming.pdfบทที่ 12 ... 1 ชิ้นคือหน่วยความจ า 1 ช่อง

เอกสารค าสอนรายวชา 2301274 ระบบคอมพวเตอร คณะวทยาศาสตร จฬาลงกรณมหาวทยาลย | 135

การเรยกฟงกชน (Functional Call) และการเรยกซ า (Recursive Call)

ปญหาของแอลซทรคอไมมฮารดแวรส าหรบ Data Stack (DS) และ Return Stack (RS) ดงนนจงเปนหนาทของ

โปรแกรมเมอรทจะตดหนวยความจ าบางสวนมาท าสแตก เมอมการเรยกใชฟงกชนจะเกดสแตกเฟรมขน (stack

frame หรอเรยกอกชอหนงวา activation record) สแตกเฟรมของการเรยกฟงกชน 1 ครงประกอบดวยสวนตางๆ

ดงแสดงในรปท 12.3 ทงกอนสแตกเฟรมคอออบเจกต (object) 1 ชนทเราจะ push ลงไปใน stack

รปท 12.3 สแตกเฟรม

ในชองสเหลยม 1 ชนคอหนวยความจ า 1 ชอง มขนาด 16 บต ตวช (pointer) ทชทออบเจกตสแตกเฟรม จะช ไป

ทชอง frame pointer ดงนนถาเราเอา R5 เปนตวชกจะอานคาตางๆ ในสแตกเฟรมไดดงน

LD R0, R5, #0 ; R0 = frame pointer

LD R0, R5, #-1 ; R0 = local variable ตวท 1

LD R0, R5, #-2 ; R0 = local variable ตวท 2

LD R0, R5, #-3 ; R0 = local variable ตวท 3

LD R0, R5, #1 ; R0 = return address

LD R0, R5, #2 ; R0 = return value

LD R0, R5, #3 ; R0 = argument ตวสดทาย

การเรยกฟงกชนแตละครงจะสรางสแตกเฟรมขนมา 1 ออบเจกตเสมอ (แมวาจะเปนการเรยกฟงกชนเดม

ซ า) แตละระเบยน (record) ในสแตกเฟรมคอ

Local variable หมายถง ตวแปรทประกาศและใชอยในฟงกชนทท าใหเกดสแตกเฟรมน

Frame pointer คอ ฟงกชนทชกลบไปทสแตกเฟรมของ caller

Return address คอ เมอท า callee เสรจแลว ตองให PC = return address เพอกลบไปท างานตอ

ใน caller ใหถกตอง

Return value คอ คาทสงกลบจากฟงกชนทเปนเจาของสแตกเฟรมน (callee) ไปให caller

Argument คอ อารกวเมนตของฟงกชนททเปนเจาของสแตกเฟรมน (caller) ซงรบมาจาก caller

Page 6: บทที่ 12pioneer.netserv.chula.ac.th/~achatcha/2301274/MyBook_12_LC3Programming.pdfบทที่ 12 ... 1 ชิ้นคือหน่วยความจ า 1 ช่อง

เอกสารค าสอนรายวชา 2301274 ระบบคอมพวเตอร คณะวทยาศาสตร จฬาลงกรณมหาวทยาลย | 136

ผมใหสแตกเรมตนจากหนวยความจ าเลขท 0xFDFF และสแตกจะโตข นไปทาง x0000 การเรยกฟงกชนม

ขนตอนดงน (ให R5 ชทสแตกเฟรมปจจบน, R6 ชท TOS)

1. caller เรม push อารกวเมนตลงไปในสแตก (เรมสรางสแตกเฟรมใหมให callee)

2. เรยกค าสง JSR หรอ JSRR เพอกระโดดไปท างานใน callee

3. callee จะสรางสแตกเฟรมใหมใหเสรจ โดยบนทกคา R7 ลงชอง return address, เซตคา

frame pointer ใหชกลบไปทสแตกเฟรมของ caller จองทในแสตกส าหรบ local variable (ถา

ม) โดย push คาเรมตนของ local variable ลงไปสแตก

4. callee ท าการค านวณผลลพธจนเสรจ และเขยนผลลพธลงในชอง return value

5. เมอจะกลบไปยง caller ตองเลอน R6 (TOS) ใหไปชท return value, เอา return address

กลบมาไวท R7, เซต R5 ใหชกลบไปยงสแตกเฟรมของ caller

6. เรยกค าสง RET เพอกระโดดกลบไปท างานใน caller

7. caller จะร วาผลลพธทสงกลบจาก callee อยท TOS (R6)

8. caller จะอานผลลพธมาใช แลวท าลายสแตกเฟรมของ callee ทงไป

9. caller จะท างานตอจากค าสงทเรยก callee

ลองดตวอยางตอไปน

sum(a, b) {

return a + b

}

main(void) {

x = sum(1,2)

}

เขยนโปรแกรมดวยภาษาแอสเซมบลไดดงน

.ORIG x3000

; make a stack frame for main program (operating systems will do this)

LD R6, TOS

LD R0, ZERO

ADD R6, R6, #-1

STR R0, R6, #0 ; push 0 (return value)

ADD R6, R6, #-1

STR R0, R6, #0 ; push 0 (return address)

ADD R6, R6, #-1

STR R0, R6, #0 ; push 0 (frame pointer)

ADD R5, R6, #0 ; R5 = R6, set frame pointer

ADD R6, R6, #-1 ; local variable (x)

Page 7: บทที่ 12pioneer.netserv.chula.ac.th/~achatcha/2301274/MyBook_12_LC3Programming.pdfบทที่ 12 ... 1 ชิ้นคือหน่วยความจ า 1 ช่อง

เอกสารค าสอนรายวชา 2301274 ระบบคอมพวเตอร คณะวทยาศาสตร จฬาลงกรณมหาวทยาลย | 137

; main program

LD R0, ONE

ADD R6, R6, #-1

STR R0, R6, #0 ; push argument, 1

LD R0, TWO

ADD R6, R6, #-1

STR R0, R6, #0 ; push argument, 2

JSR SUM

LDR R0, R6, #0

STR R0, R5, #-1 ; x = R0

ADD R6, R6, #3 ; pop 3 items, destroy callee's stack frame

HALT

SUM ADD R6, R6, #-2

STR R7, R6, #0 ; push R7 (save return address)

ADD R6, R6, #-1

STR R5, R6, #0 ; push R5 (save frame pointer)

ADD R5, R6, #0 ; R5 = R6 (move to the new frame)

LDR R1, R5, #4 ; R1 = the 1st argument

LDR R2, R5, #3 ; R2 = the 2nd argument

ADD R0, R1, R2

STR R0, R5, #2 ; save return value

ADD R6, R6, #2 ; R6 += 2 (-> return value)

LDR R7, R5, #1 ; restore R7 (if R7 has been overwritten)

LDR R5, R5, #0 ; R5 -> caller's stack frame

RET

ZERO .FILL 0x0000

ONE .FILL 0x0001

TWO .FILL 0x0002

TOS .FILL 0xFE00 ; 0xFDFF + 1

.END

Page 8: บทที่ 12pioneer.netserv.chula.ac.th/~achatcha/2301274/MyBook_12_LC3Programming.pdfบทที่ 12 ... 1 ชิ้นคือหน่วยความจ า 1 ช่อง

เอกสารค าสอนรายวชา 2301274 ระบบคอมพวเตอร คณะวทยาศาสตร จฬาลงกรณมหาวทยาลย | 138

อปกรณอนพตเอาตพตทแมพลงไปบนหนวยความจ า (Memory-mapped I/O)

ทผานมาไดแสดงใหดแลววาไมโครโปรเซสเซอรอานและเขยนหนวยความจ าไดอยางไร ทน ถามอปกรณอนพต

เอาตพตแลวไมโครโปรเซสเซอรจะอานและเขยนอปกรณเหลานนไดอยางไร วธหนงกคอใชการแมพลงไปบน

หนวยความจ า (memory-mapped I/O) หลกการคอท าใหอปกรณนนมเลขทอย (address) ซอนทบกบเลขทอย

ของหนวยความจ า เชน คยบอรดอยท 0xFF01 เมอจะอานคาจากคยบอรดกใหโหลดคาจาก 0xFF01 ไดเลย (ขอ

ไมอธบายวาออกแบบฮารดแวรยงไง ใหลองจนตนาการดเอง) แตวธน มขอเสยกคอจะเสยหนวยความจ าไป

บางสวน ถาไมท า memory-mapped I/O กตองใชค าสงพเศษส าหรบอานเขยนอปกรณอนพตเอาตพต เชน

สมมตวามค าสง RKB อานคาจากคยบอรด ถามค าสงพเศษกไมตองระบเลขทอย แตขอเสยวธนคอจะเสยค าสงไป

เพอจดการกบอปกรณอนพตเอาตพต แทนทจะใชค าสง LD/ST ทมอยแลว

คยบอรด (Keyboard)

คยบอรดทตอกบแอลซทรมเรจสเตอร 2 ตวคอ KBSR และ KBDR ดงรปท 12.4 บตทท าเครองหมายกากบาท

ไวคอไมไดใช

รปท 12.4 KBSR และ KBDR

ถา MSB ของ KBSR เทากบ 0 คอยงไมมการกดคยบอรด แตถามคาเปน 1 คอคยบอรดถกกดแลว และปมทถก

กดจะแสดงใน KBDR เปนรหส ASCII ตอไปน คอตวอยางโปรแกรมทรอใหมการกดคยบอรดและอานคาจาก

คยบอรดมาเกบไวใน R[0] .ORIG x3000

START LDI R1, KBSR

BRzp START

LDI R0, KBDR

HALT

KBSR .FILL 0xFE00

KBDR .FILL 0xFE02

.END

Page 9: บทที่ 12pioneer.netserv.chula.ac.th/~achatcha/2301274/MyBook_12_LC3Programming.pdfบทที่ 12 ... 1 ชิ้นคือหน่วยความจ า 1 ช่อง

เอกสารค าสอนรายวชา 2301274 ระบบคอมพวเตอร คณะวทยาศาสตร จฬาลงกรณมหาวทยาลย | 139

มอนเตอร (Monitor)

มอนเตอรกใชเรจสเตอรสองตวเหมอนคยบอรดคอ Display Status Register (DSR) และ Display Data Register

(DDR) ซงอยท 0xFE04 และ 0xFE06 ตามล าดบ ตอไปน คอโปรแกรมทพมพตวอกษรใน R[0] ออกไปท

จอภาพ ใน LC3 Simulator สามารถก าหนดคาเรมตนให R[0] ไดโดยใช Set Value ลองก าหนดคาเรมตนให

R[0] เปน 0x0041

.ORIG x3000

START LDI R1, DSR

BRzp START ; DSR = 0 คอ busy, 1 คอ ready

STI R0, DDR

HALT

DSR .FILL 0xFE04

DDR .FILL 0xFE06

.END

กบดก (Trap)

ค าสง trap เปนการเรยกใชรทน (routine) ของระบบปฏบตการ (operating system) ลองดตวอยางโปรแกรม

ตอไปน เมอปอนอนพตเปนอกษรตวใหญ โปรแกรมจะเอาตพตเปนอกษรตวเลก และโปรแกรมจะหยดเมอกด 7

.ORIG x3000

LD R2, TERM

LD R3, ASCII

START TRAP x23 ; R[0] <- keyboard

ADD R1, R2, R0

BRz EXIT

ADD R0, R0, R3

TRAP x21 ; monitor <- R[0]

BRnzp START

TERM .FILL 0xFFC9 ; character 7 (2’com)

ASCII .FILL 0x0020 ; ใชแปลงตวใหญเปนตวเลก

EXIT TRAP x25 ; HALT

.END

Trap vector ในหนวยความจ าเลขท x21, x23, x25 จะช ไปทรทนทท าหนาทตอไปน

x21 เขยนคา R0 ไปทมอนเตอร

x23 อานคาจากคยบอรดมาเกบใน R0

x25 ให shutdown หรอ halt

Page 10: บทที่ 12pioneer.netserv.chula.ac.th/~achatcha/2301274/MyBook_12_LC3Programming.pdfบทที่ 12 ... 1 ชิ้นคือหน่วยความจ า 1 ช่อง

เอกสารค าสอนรายวชา 2301274 ระบบคอมพวเตอร คณะวทยาศาสตร จฬาลงกรณมหาวทยาลย | 140

รทนน เปนสวนหนงของระบบปฏบตการซงถกโหลดมากอนท user program จะท างานแลว

Character output service routine (x21) ตามหนงสอของ Patt และ Patel

01 .ORIG x0430 ; system call starting address

02 ST R1, SaveR1 ; R1 will be used to poll the DSR

03 ; hardware

04 ; write the character

05 TryWrite LDI R1, DSR ; get status

06 BRzp TryWrite ; bit 15 on says display is ready

07 WriteIt STI R0, DDR ; write character

08

09 ; return from trap

0A Return LD R1, SaveR1 ; restore registers

0B RET ; return from trap (JMP R7, actually)

0C DSR .FILL xFE04 ; address of display status register

0D DDR .FILL xFE06 ; address of display data register

0E SaveR1 .BLKW 1

0F .END

Character input service routine (x23)ตามหนงสอของ Patt และ Patel 01 ; Service Routine for Keyboard Input

02 ;

03 .ORIG 0x04A0

04 START ST R1, SaveR1 ; save the values in the registers

05 ST R2, SaveR2 ; that are used so that they

06 ST R3, SaveR3 ; can be restored before RET

07 ;

08 LD R2, NewLine

09 L1 LDI R3, DSR ; check DDR – is it free?

0A BRzp L1

0B STI R2, DDR ; move cursor to new clean line

0C ;

0D LEA R1, Prompt ; prompt is starting address

0E ; of prompt string

0F Loop LDR R0, R1, #0 ; get next prompt character

10 BRz Input ; check for end of prompt string

11 L2 LDI R3, DSR

12 BRzp L2

13 STI R0, DDR ; write next character of

14 ; prompt string

15 ADD R1, R1, #1 ; increment prompt pointer

16 BRnzp Loop

17 ;

Page 11: บทที่ 12pioneer.netserv.chula.ac.th/~achatcha/2301274/MyBook_12_LC3Programming.pdfบทที่ 12 ... 1 ชิ้นคือหน่วยความจ า 1 ช่อง

เอกสารค าสอนรายวชา 2301274 ระบบคอมพวเตอร คณะวทยาศาสตร จฬาลงกรณมหาวทยาลย | 141

HALT service routine (x25) ตามหนงสอของ Patt และ Patel

01 .ORIG xFD70 ; where this routine resides

02 ST R7, SaveR7

03 ST R1, SaveR1 ; R1: a temp for MC register

04 ST R0, SaveR0 ; R0 is used as working space

05

06 ; print message that machine is halting

07 08 LD R0, ASCIINewLine

09 TRAP x21

0A LEA R0, Message

0B TRAP x22

0C LD R0, ASCIINewLine

0D TRAP x21

0E ;

0F ; clear bit 15 at xFFFE to stop the machine

10 ; 11 LDI R1, MCR ; load MC register into R1 12 LD R0, MASK ; R0 = x7FFF

13 AND R0, R1, R0 ; mask to clear the top bit

14 STI R0, MCR ; store R0 into MC register

15 ADD R1, R1, #1 ; increment prompt pointer

16 BRnzp Loop

17 ;

18 Input LDI R3, KBSR ; has a character been typed?

19 BRzp Input

1A LDI R0, KBDR ; load it into R0

1B L3 LDI R3, DSR

1C BRzp L3

1D STI R0, DDR ; echo input character

1E ; to the monitor

1F ;

20 L4 LDI R3, DSR

21 BRzp L4

22 STI R2, DDR ; move cursor to new clean line

23 LD R1, SaveR1 ; service routine done, restore

24 LD R2, SaveR2 ; original values in registers

25 LD R3, SaveR3 ;

26 RET ; return from trap (i.e., JMP R7)

27 ;

28 SaveR1 .BLKW 1

29 SaveR2 .BLKW 1

2A SaveR3 .BLKW 1

2B DSR .FILL xFE04

2C DDR .FILL xFE06

2D KBSR .FILL xFE00

2E KBDR .FILL xFE02

2F Newline .FILL x000A ; ASCII code for newline

30 Prompt .STRINGZ “Input a character>”

31 .END

อนพตเอาตพตทถกขบดวยการขดจงหวะ (Interrupt-driven I/O)

ตวอยางการเขยนโปรแกรมในหวขอคยบอรดและมอนเตอรเปนการโปรแกรมแบบ “polling” ขอเสยของ polling

คอซพยตองคอยอาน status register อยตลอด ท าใหเสยเวลาไปโดยเปลาประโยชน แทนทจะเอาซพยไปท างาน

อยางอน ในหวขอน จะแสดงใหเหนวาเราสามารถเปลยนโหมดการท างานของอปกรณอนพตเอาตพตใหเปนแบบ

ขดจงหวะ (interrupt) ได ตวอยางการขดจงหวะในแอลซทรเชน การอานคยบอรด เราไมตองใชซพยไปคอยอาน

คา KBSR อยตลอดเวลา ปลอยซพยไปท างานอยางอนได ตอเมอมการกดปม คยบอรดจะสงสญญาณกลบไปบอก

Page 12: บทที่ 12pioneer.netserv.chula.ac.th/~achatcha/2301274/MyBook_12_LC3Programming.pdfบทที่ 12 ... 1 ชิ้นคือหน่วยความจ า 1 ช่อง

เอกสารค าสอนรายวชา 2301274 ระบบคอมพวเตอร คณะวทยาศาสตร จฬาลงกรณมหาวทยาลย | 142

ซพยเอง เมอซพยไดรบสญญาณขดจงหวะ (ร วามาจากคยบอรด) กจะกระโดดไปท างานในรทนทใชจดการกบ

คยบอรด ซงอยทหนวยความจ าเลขท x0180 ดงนนซพยกจะเซตคา PC ใหมคาเทากบ M[x0180]

ซพยโดยทวๆ ไปจะตองมอยางนอย 2 โหมด คอ 1) โหมดก ากบดแล (supervisor หรอ privilege mode) และ

2) โหมดผ ใช (user mode) โหมดแรกจะท าไดทกอยาง ไมวาจะเปนการท า (execute) ค าสงใดๆ และอาน/

เขยนเรจสเตอรไดทกตว โหมดทสองจะถกจ ากดสทธ เชน ไมสามารถท าบางค าสง หรอไมสามารถอาน/เขยนเรจส

เตอรบางตวได ทตองมสองโหมดเพราะวาโหมดแรกใชส าหรบระบบปฏบตการและโหมดทสองส าหรบโปรแกรม

ผ ใช (user program) ในแอลซทรโหมดผ ใชจะท าค าสง RTI ไมได และแกไขเรจสเตอรบางตวเชน Processor

Status Register (PSR) ไมได

โดยปกตเมอโปรแกรมผ ใชท างาน ซพยจะอยในโหมดผ ใชเมอเกดการขดจงหวะจะเปลยนเปนโหมดก ากบดแล

เพออาน/เขยนเรจสเตอรของอปกรณทท าใหเกดสญญาณขดจงหวะ เรจสเตอรพวกน จะไมสามารถอานเขยนใน

โหมดผใชได ลองนกถงระบบทมโปรแกรมผ ใชอยหลายๆ โปรแกรม แลวถาโปรแกรมผ ใชตองการใชอปกรณ

อยางหนง เชน เครองพมพ กจะเกดการแยงกนใชงาน ดงนนกตองใหระบบปฏบตการซงเปนคนกลางคอย

จดล าดบการใชงานให เรองนจะไปเรยนตอในวชา 2301371 ระบบปฏบตการ

การเปดทาง (enable) ใหคยบอรดท างานแบบขดจงหวะท าไดโดยเซตบตท 14 ของ KBSR ใหเปน “1” ดงแสดง

ในรปท 12.5

รปท 12.5 Interrupt Enable (IE)

ระบบปฏบตการของแอลซทรแบงการใชหนวยความจ าดงรปท 12.6 สามสวนแรกเปนตารางเวกเตอร (vector

table) ส าหรบ กบดก (trap), ความผดปรกต (exception), และการขดจงหวะ (interrupt) ในโปรแกรม LC3

simulator มการขดจงหวะเฉพาะคยบอรดเทานน โดยม interrupt vector อยท x0180 สวนความผดปรกต

(exception) ในแอลซทรมสองตว ซงจะสรางสญญาณขดจงหวะขน เมอเกดเหตการณตอไปน

Privilege mode violation เชน เมอท าค าสง RTI ในโหมดผใช

Illegal opcode เชน opcode = 1101 (ไมมรหสด าเนนการน ในแอลซทร)

โดยม interrupt vector อยท x0100 และ x0101 ตามล าดบ (ความผดปรกตหรอ exception กเปนการขดจงหวะ

ประเภทหนง ท างานเหมอนการขดจงหวะ) หนวยความจ าสวนถดมาจะเปนของระบบปฏบตการ โปรแกรมผ ใช

และสดทายเปน memory-mapped I/O ส าหรบแมพ (map) ไปยงเรจสเตอรของอปกรณตางๆ

Page 13: บทที่ 12pioneer.netserv.chula.ac.th/~achatcha/2301274/MyBook_12_LC3Programming.pdfบทที่ 12 ... 1 ชิ้นคือหน่วยความจ า 1 ช่อง

เอกสารค าสอนรายวชา 2301274 ระบบคอมพวเตอร คณะวทยาศาสตร จฬาลงกรณมหาวทยาลย | 143

รปท 12.6 การแบงใชหนวยความจ าของแอลซทร

ตวอยางโปรแกรมตอไปนจะใชการขดจงหวะเพอแสดงตวอกขระทปอนทางคยบอรดใหน ามาแสดงทจอภาพ USP

หมายถง user stack pointer (หรอ TOS ของ user stack)

.ORIG x3000

LD R6, USP

LEA R0, INTR

STI R0, VECT

LD R0, ENAB

STI R0, KBSR

WAIT BRnzp WAIT

HALT

INTR LDI R0, KBDR

TRAP x21

RTI

VECT .FILL x0180

ENAB .FILL x4000

KBSR .FILL xFE00

KBDR .FILL xFE02

USP .FILL xFE00

.END

Page 14: บทที่ 12pioneer.netserv.chula.ac.th/~achatcha/2301274/MyBook_12_LC3Programming.pdfบทที่ 12 ... 1 ชิ้นคือหน่วยความจ า 1 ช่อง

เอกสารค าสอนรายวชา 2301274 ระบบคอมพวเตอร คณะวทยาศาสตร จฬาลงกรณมหาวทยาลย | 144

เวลา “step over” โปรแกรมน ใน LC3 simulator มนจะไมเขาไปท างานใน interrupt service routine ตองใชวธ

สงเกตคาในเรจสเตอร R0 ทจะเปลยนไปตามตวอกขระทเราปอนทางคยบอรด

เรจสเตอรสถานะของโพรเซสเซอร (Processor Status Register)

เรจสเตอรอกตวหนงในแอลซทรทไมไดกลาวถงตงแตแรกคอ processor status register (PSR) แสดงในรปท

12.7

รปท 12.7 Processor Status Register (PSR)

เราจะใชแคบางบตของเรจสเตอรเทานน

บตท 15 ถาเปน 0 คอ โหมดก ากบดแล (supervisor mode), 1 คอ โหมดผใช (user mode)

บตท 10, 9, 8 คอ ล าดบความส าคญ (priority) ของโปรแกรม

อปกรณ (device) ทล าดบความส าคญสงกวาจะสามารถขดจงหวะโปรแกรมทล าดบ

ความส าคญต ากวาได เชน คยบอรด ม PL = 4 เปนตน (max = 7, min = 0)

บตท 2, 1, 0 คอ รหสเงอนไข (condition code) ตามทสอนไปแลว

ล าดบความส าคญของการขดจงหวะ (Interrupt Priority)

ในกรณทมอปกรณหลายชนสรางสญญาณขดจงหวะขนมาพรอมๆ กน จะตองมวงจรทใชเลอกอปกรณทมล าดบ

ความส าคญสงสด และตองมล าดบความส าคญสงกวาโปรแกรมปจจบนดวย ถงจะขดจงหวะได ดงรปท 12.8

รปท 12.8 ฮารดแวรส าหรบเลอกอปกรณทมล าดบความส าคญสงสด

Page 15: บทที่ 12pioneer.netserv.chula.ac.th/~achatcha/2301274/MyBook_12_LC3Programming.pdfบทที่ 12 ... 1 ชิ้นคือหน่วยความจ า 1 ช่อง

เอกสารค าสอนรายวชา 2301274 ระบบคอมพวเตอร คณะวทยาศาสตร จฬาลงกรณมหาวทยาลย | 145

เมอเกดการขดจงหวะแลวระบบปฏบตการจะตองท าอะไรบาง

ตอไปน เปนหนาทของระบบปฏบตการทจะตองท าเมอโพรเซสเซอรไดรบสญญาณขดจงหวะ

เปลยนโหมดผใช (user mode) เปนโหมดก ากบดแล (supervisor mode)

PSR[15] = 0, PSR[10:8] = PL ของอปกรณทสรางสญญาณขดจงหวะ, PSR[2:0] = 000

บนทกคา user stack pointer และโหลดคา supervisor stack pointer โดยท าดงน

(Saved.USP และ Saved.SSP เปนเรจสเตอรพเศษทใชเพองานน โดยเฉพาะ)

o Saved.USP = R[6] // R[6] เกบ stack pointer เสมอ

o R[6] = Saved.SSP

แตถาเปนการขดจงหวะซอนการขดจงหวะกไมตองท าขนตอนน เพราะ R6 จะเปน Saved.SSP อยแลว บนทก (push) คา PC และ PSR ลง supervisor stack

บนทกคาเรจสเตอร เชน R0, R1, … โดยเกบไวใน supervisor stack (ถา callee จะใชเรจสเตอร)

เซต PC ใหมคาเทากบ interrupt vector

เรมท า interrupt service routine

interrupt service routine จะจบดวยค าสง RTI ซงมการท างานดงน

pop คาเรจสเตอร R0, R1, … ทบนทกไว (ถาม)

pop คา PSR และ PC ออกมาจาก supervisor stack

ถาเปนโหมดผใช (ด PSR ท pop ออกมา) ใหบนทกคา supervisor stack pointer

และโหลด user stack pointer โดยท าดงน

o Save.SSP = R[6]

o R[6] = Saved.USP

แตถาเปนการขดจงหวะซอนการขดจงหวะจะยงอยในโหมดก ากบดแลกไมตองท าอะไร เซต PC ใหเทากบคา PC ท pop ออกมาจาก supervisor stack

กลบไปท างานตอใน caller จากจดทถกขดจงหวะ

หมายเหต - ค าสง RTI ท างานไดใน supervisor mode เทานน

- ในขณะทท า interrupt service routine หนงอย (ยงไมเสรจ) กอาจจะโดนขดจงหวะซอนได

เอกสารประกอบ (ส าหรบอานเพมเตม)

อานเพมเตมเกยวกบแอลซทรโพรเซสเซอรไดจากหนงสอเลมน

Yale N. Patt and Sanjay J. Patel, Introduction to Computing Systems: From bits & gates to C &

beyond, McGraw-Hill, 2003.

ใหนสตอานเรอง synchronous และ asynchronous I/O จากหนงสอของ Patt และ Patel

Page 16: บทที่ 12pioneer.netserv.chula.ac.th/~achatcha/2301274/MyBook_12_LC3Programming.pdfบทที่ 12 ... 1 ชิ้นคือหน่วยความจ า 1 ช่อง

เอกสารค าสอนรายวชา 2301274 ระบบคอมพวเตอร คณะวทยาศาสตร จฬาลงกรณมหาวทยาลย | 146

แบบฝกหด

1. จงตอบค าถามตอไปน

ก. device register คออะไร

ข. device data register คออะไร

ค. device status register คออะไร

2. ท าไม ready bit ถงไมจ าเปน ถาใช synchronous I/O

3. อปกรณตอไปนท างานแบบประสานเวลา (synchronous) หรอไมประสานเวลา (asynchronous)

ก. รโมตและโทรทศน

ข. บรษไปรษณย ตจดหมาย (mailbox) และผรบจดหมาย

ค. เมาสและคอมพวเตอร

4. ถาโปรแกรมไมเชค ready bit ของ KBSR กอนอาน KBDR จะเกดปญหาอยางไร (จะเกดความเสยหายใน

รปแบบไหน ลกษณะใด) แลวถาโปรแกรมไมเชค KBSR กอนเขยน KBDR จะเกดปญหาอยางไร

5. ถาโปรแกรมไมเชค DSR กอนเขยน DDR จะเกดปญหาอยางไร

6. การจดการกบอปกรณอนพตเอาตพตแบบ polling กบ interrupt-driven I/O อยางใดมประสทธภาพมากกวา

กน เพราะเหตใด

7. Synchronous I/O ตางจาก Asynchronous I/O อยางไร

8. โปรแกรมตอไปนท าอะไร .ORIG x3000

LD R3, A

STI R3, KBSR

AGAIN LD R0, B

TRAP x21

BRnzp AGAIN

A .FILL x4000

B .FILL x0032

KBSR .FILL xFE00

.END

9. รทน (routine) ตอไปนจะถกเรยกเมอเกดการขดจงหวะ (interrupt) จากการกดคยบอรด รทนนท าอะไร

.ORIG x1000

LDI R0, KBDR

TRAP x21

TRAP x21

RTI

KBDR .FILL xFE02

.END

10. โปรแกรมตอไปนท าอะไร .ORIG x3000

LD R0, ASCII

LD R1, NEG

AGAIN LDI R2, DSR

BRzp AGAIN

STI R0, DDR

ADD R0, R0, #1

ADD R2, R0, R1

BRnp AGAIN

HALT

ASCII .FILL x0041

NEG .FILL xFFB6 ; -x004A

DSR .FILL xFE04

DDR .FILL xFE06

.END

Page 17: บทที่ 12pioneer.netserv.chula.ac.th/~achatcha/2301274/MyBook_12_LC3Programming.pdfบทที่ 12 ... 1 ชิ้นคือหน่วยความจ า 1 ช่อง

เอกสารค าสอนรายวชา 2301274 ระบบคอมพวเตอร คณะวทยาศาสตร จฬาลงกรณมหาวทยาลย | 147

11. จงตอบสนๆ วาโปรแกรมตอไปนท าอะไร และการเขยนโปรแกรมมขอผดพลาดอะไรบาง .ORIG x3000 BEGIN LD R0, KBDR ST R0, DDR BRnzp BEGIN KBDR .FILL xFE02 DDR .FILL xFE06

.END

12. จากโปรแกรมทใหจงตอบค าถามตอไปน .ORIG x3000 LD R6, SSP LEA R0, INTR STI R0, VECT LD R0, ENAB STI R0, KBSR WAIT BRnzp WAIT HALT INTR LDI R0, KBDR TRAP x21 RTI VECT .FILL x0180 ENAB .FILL x4000 KBSR .FILL xFE00 KBDR .FILL xFE02 SSP .FILL x3000

.END

ก. โปรแกรมนจะเขาสโหมดก ากบดแล (supervisor mode)

เมอเกดเหตการณใด

ข. โปรแกรมนจะออกจากโหมดผใช (user mode)

เมอท าค าสงใด

ค. ค าสง STI R0, KBSR ท าเพออะไร

ง. เมอเกดการขดจงหวะ (interrupt) จะตองบนทก

เรจสเตอรตวใดบางลง supervisor stack

13. จงตอบสนๆ วาโปรแกรมตอไปนท าอะไร .ORIG x3000 LDI R1, KB LDI R2, DP STI R1, DP STI R2, KB HALT KB .FILL x23 DP .FILL x21

.END

Page 18: บทที่ 12pioneer.netserv.chula.ac.th/~achatcha/2301274/MyBook_12_LC3Programming.pdfบทที่ 12 ... 1 ชิ้นคือหน่วยความจ า 1 ช่อง

เอกสารค าสอนรายวชา 2301274 ระบบคอมพวเตอร คณะวทยาศาสตร จฬาลงกรณมหาวทยาลย | 148

14. จากโปรแกรมทให จงตอบค าถามตอไปน .ORIG x3000 LD R6, TOS LD R0, ZERO ADD R6, R6, #-1 STR R0, R6, #0 ADD R6, R6, #-1 STR R0, R6, #0 ADD R6, R6, #-1 STR R0, R6, #0 ADD R6, R6, #-1 STR R0, R6, #0 ADD R5, R6, #0 LD R0, N ADD R6, R6, #-1 STR R0, R6, #0 JSR SUM LDR R0, R6, #0 STR R0, R5, #0 ADD R6, R6, #2 HALT SUM ADD R6, R6, #-1 ADD R6, R6, #-1 STR R7, R6, #0 ADD R6, R6, #-1 STR R5, R6, #0 ADD R5, R6, #-1 ADD R6, R6, #-1 LDR R0, R5, #4 BRz NEXT1 BRp POS BRn NEG POS LD R1, ZERO BR CONT NEG LD R1, ONE CONT STR R1, R5, #4 ADD R0, R0, R0 ADD R6, R6, #-1 STR R0, R6, #0 JSR SUM LDR R0, R6, #0 ADD R6, R6, #2 LDR R1, R5, #4 ADD R0, R1, R0 BR NEXT2 NEXT1 LD R0, ZERO NEXT2 STR R0, R5, #3 LDR R7, R5, #2 LDR R5, R5, #1 ADD R6, R6, #3 RET TOS .FILL xFE00 ZERO .FILL x0000 ONE .FILL x0001 N .FILL x000A .END

Note: R5 คอ frame pointer (ชท local var ตวแรก)

R6 คอ top of stack

R7 คอ return address

ค าถาม

ก. ฟงกชน SUM รบอารกวเมนตกตว ข. โปรแกรมนท าอะไร

ค. เมอโปรแกรม HALT, R0 จะมคาเปนเทาใด

Page 19: บทที่ 12pioneer.netserv.chula.ac.th/~achatcha/2301274/MyBook_12_LC3Programming.pdfบทที่ 12 ... 1 ชิ้นคือหน่วยความจ า 1 ช่อง

เอกสารค าสอนรายวชา 2301274 ระบบคอมพวเตอร คณะวทยาศาสตร จฬาลงกรณมหาวทยาลย | 149

15. จงเตมโปรแกรม sum(n) ตอไปน ใหสมบรณ

sum(0) = 0, sum(n) = n + sum(n – 1)

เชน sum(5) = 5 + 4 + 3 + 2 + 1 + 0 = 15 .ORIG x3000

LD R6, TOS

AND R0, R0, #0

ADD R6, R6, #-1

STR R0, R6, #0 ; push 0 (return value)

ADD R6, R6, #-1

STR R0, R6, #0 ; push 0 (return address)

ADD R6, R6, #-1

STR R0, R6, #0 ; push 0 (frame pointer)

ADD R5, R6, #0 ; R5 = R6, set frame pointer

ADD R6, R6, #-1 ; local variable (x)

; main program

ADD R0, R0, #5 ; n = 5

ADD R6, R6, #-1

STR R0, R6, #0 ; push argument (n)

JSR SUM

LDR R0, R6, #0

STR R0, R5, #-1 ; x = R0

ADD R6, R6, #2 ; pop 2 items, destroy callee's stack frame

HALT

SUM ADD R6, R6, #-2

STR R7, R6, #0 ; push R7 (save return address)

ADD R6, R6, #-1

STR R5, R6, #0 ; push R5 (save frame pointer)

ADD R5, R6, #0 ; R5 = R6 (move to the new frame)

LDR R1, R5, #3 ; R1 = current argument (n)

BRz NEXT

ADD R1, R1, #-1

ADD R6, R6, #-1

STR R1, R6, #0 ; push the next argument (n - 1)

....................

LDR R1, ......... ; load n

LDR R2, ......... ; load sum(n - 1)

ADD R3, R1, R2 ; R3 = n + sum(n - 1)

STR R3, R5, #2 ; save return value

.................... ; R6 -> return value

LDR R7, R5, #1 ; restore R7 (if R7 has been overwritten)

LDR R5, R5, #0 ; R5 -> caller's stack frame

RET

NEXT STR R1, R5, #2 ; save return value (0)

ADD R6, R6, #2 ; R6 -> return value

LDR R7, R5, #1 ; restore R7 (if R7 has been overwritten)

LDR R5, R5, #0 ; R5 -> caller's stack frame

RET

TOS .FILL 0xFE00 .END

main() {

x = sum(5)

}

sum(n) { // n >= 0 เสมอ if (n == 0) {

return 0

} else {

return n + sum(n – 1)

}

}

Page 20: บทที่ 12pioneer.netserv.chula.ac.th/~achatcha/2301274/MyBook_12_LC3Programming.pdfบทที่ 12 ... 1 ชิ้นคือหน่วยความจ า 1 ช่อง

เอกสารค าสอนรายวชา 2301274 ระบบคอมพวเตอร คณะวทยาศาสตร จฬาลงกรณมหาวทยาลย | 150

16. จงตอบค าถามตอไปน

ก. โปรแกรมรบ character จากคยบอรดและพมพ

ออกทจอภาพ โปรแกรมนผดตรงไหน

.ORIG x3000

LOOP1 LDI R1, KBSR

BRzp LOOP1

LDI R0, KBDR

LOOP2 LDI R1, DSR

BRzp LOOP2

ST R0, DDR

HALT

KBSR .FILL xFE00

KBDR .FILL xFE02

DSR .FILL xFE04

DDR .FILL xFE06

.END

ข. โปรแกรมนท าอะไร

.ORIG x3000

LD R0, ASCII

LD R1, NEG

AGAIN LDI R2, DSR

BRzp AGAIN

STI R0, DDR

ADD R0, R0, #1

ADD R2, R0, R1

BRnp AGAIN

HALT

ASCII .FILL x0041 ; letter A

NEG .FILL xFFB6 ; -x004A

DSR .FILL xFE04

DDR .FILL xFE06

.END

ค. จงเตมโปรแกรมเชค valid ASCII ใหสมบรณ รหส

ASCII จะมคาระหวาง 0 – 255 เทานน (x00 – xFF)

ถา ASCII valid, RESULT = 1 ถาไม RESULT = 0

(2 คะแนน)

.ORIG x3000

AND R0, R0, #0

LD R1, ASCII

LD R2, MASK

AND R3, R1, R2

...............

ADD R0, R0, #1

NEXT ST R0, RESULT

HALT

ASCII .BLKW 1

MASK .FILL ......

RESULT .BLKW 1

.END

ง. นสตคนหนงเขยนโปรแกรมเพอพมพ character ออก

ไปทางจอภาพทละตว ผลปรากฎวา character บางตว

ไมแสดงบนจอภาพ ปญหาน นาจะเกดจากอะไร

จ. จงเตมโปรแกรมตอไปน ใหสมบรณ โปรแกรมรบ character จากคยบอรดโดยใช interrupt และพมพออกทางจอภาพ

.ORIG x3000

LD R6, USP

......................

......................

......................

......................

WAIT BRnzp WAIT

HALT

VECT LDI R0, KBDR

TRAP x21

RTI

INTR .FILL x0180

ENAB .FILL x4000

KBSR .FILL xFE00

KBDR .FILL xFE02

USP .FILL xFE00

.END

Page 21: บทที่ 12pioneer.netserv.chula.ac.th/~achatcha/2301274/MyBook_12_LC3Programming.pdfบทที่ 12 ... 1 ชิ้นคือหน่วยความจ า 1 ช่อง

เอกสารค าสอนรายวชา 2301274 ระบบคอมพวเตอร คณะวทยาศาสตร จฬาลงกรณมหาวทยาลย | 151

รายการอางอง

[1] Yale N. Patt and Sanjay J. Patel, Introduction to Computing Systems: From bits & gates to C &

beyond, McGraw-Hill, 2003.