Upload
others
View
2
Download
0
Embed Size (px)
Citation preview
เอกสารค าสอนรายวชา 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]
เอกสารค าสอนรายวชา 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
เอกสารค าสอนรายวชา 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
เอกสารค าสอนรายวชา 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
เอกสารค าสอนรายวชา 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
เอกสารค าสอนรายวชา 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)
เอกสารค าสอนรายวชา 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
เอกสารค าสอนรายวชา 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
เอกสารค าสอนรายวชา 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
เอกสารค าสอนรายวชา 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 ;
เอกสารค าสอนรายวชา 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 อยตลอดเวลา ปลอยซพยไปท างานอยางอนได ตอเมอมการกดปม คยบอรดจะสงสญญาณกลบไปบอก
เอกสารค าสอนรายวชา 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) ไปยงเรจสเตอรของอปกรณตางๆ
เอกสารค าสอนรายวชา 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
เอกสารค าสอนรายวชา 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 ฮารดแวรส าหรบเลอกอปกรณทมล าดบความส าคญสงสด
เอกสารค าสอนรายวชา 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
เอกสารค าสอนรายวชา 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
เอกสารค าสอนรายวชา 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
เอกสารค าสอนรายวชา 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 จะมคาเปนเทาใด
เอกสารค าสอนรายวชา 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)
}
}
เอกสารค าสอนรายวชา 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
เอกสารค าสอนรายวชา 2301274 ระบบคอมพวเตอร คณะวทยาศาสตร จฬาลงกรณมหาวทยาลย | 151
รายการอางอง
[1] Yale N. Patt and Sanjay J. Patel, Introduction to Computing Systems: From bits & gates to C &
beyond, McGraw-Hill, 2003.