スタックについてのメモ
0〜255までのRAMのうち、スタックは255、254、253、...と伸びていく
スタックポインタ(SP)
スタックの先頭アドレスを指すポインタ
スタックへPUSHするごとに255から-1ずつ減っていく
スタックが空の場合のSPの値は「0」
PUSH
SP = SP - 1
RAM[SP] = val
POP
val = RAM[SP]
SP = SP + 1
callとretとスタック
call sp sp_offset function_label
ret sp sp_offset 0
スタック操作のサンプル
code:push_and_pop
const add 0
const add_ri 64
const add_ii 192
const sub 1
const sub_ri 65
const jeq 32
const jeq_ii 224
const jlt 34
const jlte 35
const sw 16
const sw_ri 80
const lw 17
const lw_ri 81
const call 8
const ret 9
const r0 0
const r1 1
const r2 2
const r3 3
const r4 4
const r5 5
const sp 5
const counter 6
const input 7
const output 7
const _ 0
# save to registers
expect 1 10
add_ii 10 _ r1
expect 2 20
add_ii 20 _ r2
expect 3 30
add_ii 30 _ r3
# push to stack
expect 5 253
sub_ri sp 3 sp
sw_ri sp 0 r1
sw_ri sp 1 r2
sw_ri sp 2 r3
# reset registers
expect 1 0
add_ii 0 _ r1
expect 2 0
add_ii 0 _ r2
expect 3 0
add_ii 0 _ r3
# restore from stack
expect 1 10
lw_ri sp 0 r1
expect 2 20
lw_ri sp 1 r2
expect 3 30
lw_ri sp 2 r3
label loop
jeq _ _ loop