PDP-11のトラップのテスト動作
PDP-11のトラップの動きの確認したく、簡単なアセンブラプログラミングをして、
続いて、
SPはカーネルモードの010000からになっている。狙い通りの動き。
一回ステップ実行して、MFPI SPを実行させてみた。
simhでブレークをはって以下の情報を確かめてみた。
- カーネルモードとユーザモードのSPのレジスタが別であること
- トラップ時のPSWの値の確認
- mfpi 命令の動き
アセンブラプログラムは以下:
.global start
PS = 0177776
.text
.even
start:
mov $0010000, sp / set kernel mode's stack pointer
mov $0140000, PS / change current mode to user mode
mov $0020000, sp / set user mode's stack pointer
mov 0, r0
/ copy vector table to zero address
mov $vector, r1
mov $vectorend, r2
1$: mov (r1)+,(r0)+
cmp r1,r2
bne 1$
trap 0377
2$: br 2$
trap:
mfpi sp / push in stack previous mode's stack pointer
rti
.data
.even
vector:
.word 0
.word 0
/ trap vectors
.word 0, 0 / bus error
.word 0, 0 / illegal instruction
.word 0, 0 / bpt-trace trap
.word 0, 0 / iot trap
.word 0, 0 / power fail
.word 0, 0 / emulator trap
.word trap, 0346 / system entry
vectorend = .
.end
上記は、SPの値を
カーネルモード → 010000
ユーザモード → 020000
にしている。
さて、simhに01000番地にプログラムをロードしてから、
sim> e -m 1000:1100
1000: MOV #10000,SP
1004: MOV #140000,177776
1012: MOV #20000,SP
1016: MOV 0,R0
1022: MOV #1050,R1
1026: MOV #1110,R2
1032: MOV (R1)+,(R0)+
1034: CMP R1,R2
1036: BNE 1032
1040: TRAP 377
1042: BR 1042
1044: MFPI SP
1046: RTI
1050: HALT
1052: HALT
1054: HALT
1056: HALT
1060: HALT
1062: HALT
1064: HALT
1066: HALT
1070: HALT
1072: HALT
1074: HALT
1076: HALT
1100: HALT
sim> br 1044
sim> g
Breakpoint, PC: 001044 (MFPI SP)
sim> e psw
PSW: 030346
sim>
さて、トラップが起きた直後のアドレスにブレークポイントをはって止めた状態で、
PSWの値を確かめてみたが、030346は想定通り。
03xxxxは前モードがユーザモードであることを意味している。
xxx346は、トラップベクターに設定した値そのまま。
.word trap, 0346 / system entry
続いて、
sim> e sp
SP: 007774
sim> e 7770:10000
7770: 000000
7772: 000000
7774: 001042
7776: 140004
10000: 000000
SPはカーネルモードの010000からになっている。狙い通りの動き。
さらに、
sim> s
Step expired, PC: 001046 (RTI)
sim> e 7770:10000
7770: 000000
7772: 020000
7774: 001042
7776: 140004
10000: 000000
一回ステップ実行して、MFPI SPを実行させてみた。
スタックには、ユーザモードのSP値の020000が積まれている。
うむ、仕様通りの動き、確認できた。と。
以上。
2014-10-19 21:17
nice!(0)
コメント(0)
トラックバック(0)
コメント 0