2010-06-13 65 views
1

我對PDP-11組裝PDP-11(模擬器)

tks = 177560 
tkb = 177562 
tps = 177564 
tpb = 177566 
lcs = 177546 
. = torg + 2000 

main: mov #main, sp 
     mov #kb_int, @#60 
     mov #200, @#62 
     mov #101, @#tks 
     mov #clock, @#100 
     mov #300, @#102 
     mov #100, @#lcs 

loop: mov @#tks,r2 
     aslb r2 
     bmi loop 
     halt 

clock: tst bufferg 
     beq clk_end 
     mov #msg,-(sp) 
     jsr pc, print_str 
     tst (sp)+ 
     clr bufferg 
     biC#100,@#tks 
     clr @#lcs 
clk_end:rti 

kb_int: mov r1,-(sp) 
     jsr pc, read_char 
     movb r1,@buff_ptr 
     inc buff_ptr 
     bis #1,@#tks 
     cmpb r1,#'q 
     bne next_if 
     mov #0, @#tks 
next_if:cmpb r1,#32. 
     bne end_kb_int 
     clrb @buff_ptr 
     mov #buffer,-(sp) 
     jsr pc, print_str 
     tst (sp)+ 
     mov #buffer,buff_ptr 
end_kb_int: 
     mov (sp)+,r1 
rti 


;############################# 
read_char: 
     tstb @#tks 
     bpl read_char 
     movb @#tkb, r1 
     rts pc 
;############################# 
print_char: 
     tstb @#tps 
     bpl print_char 
     movb r1, @#tpb 
     rts pc 
;############################# 
print_str: 
     mov r1,-(sp) 
     mov r2,-(sp) 
     mov 6(sp),r2 
str_loop: 
     movb (r2)+,r1 
     beq pr_str_end 
     jsr pc, print_char 
     br str_loop 
pr_str_end: 
     mov (sp)+,r2 
     mov (sp)+,r1 
     rts pc 

. = torg + 3000 
msg:.ascii<Something is wrong!> 
    .byte 0 
    .even 
buff_ptr: .word buffer 
buffer: .blkw 3 
bufferg: .word 0 

有人可以解釋請這部分代碼可以改變bufferg(最後一行)這個代碼?由於事先

+0

你有更具體的問題嗎? – 2010-06-13 17:31:57

+0

是的,我改變了我的問題的最後一部分 – lego69 2010-06-13 17:48:30

回答

1

我在此程序中找到的三個基本功能塊:

  1. 讀取的字符從鍵盤到緩衝器(kb_int:, read_char:等)字符(print_char:, print_str:
  2. 監測的
  3. 印刷上述操作的讀寫正確性(clock:)。

我認爲bufferg是保護字,因爲它跟隨從鍵盤讀取數據的段(緩衝區g是緩衝區的3個字 - 最後兩行之後的一個字)。所以,如果出現問題(輸入字符過多或打印速度太慢),bufferg會被填充一些非零值。這被捕獲在時鐘:(這顯然是一個計時器中斷處理程序) - tst bufferg測試爲零值,如果它不等於零(它的默認值)消息(消息:)「有什麼不對!」並且bufferg被重置爲零clr bufferg

因此,問題的簡短答案是:bufferg可以在 movb r1,@buff_ptrclr bufferg中更改。