いつもすみませんが、今度は配列を用いてアセンブリコードで表示するのがわからなくて教えください。
(1) val, ass, assv命令を活用し,mem領域を配列のように使用して,キーボードから入力したデータを降順にソートして大きい順に表示する sml2のアセンブラプログラムを作成する。
3) 上記の課題(1),(2)とも実行時に与えるデータは,各自の学籍番号の10進表記7桁が abcdefg であるとき,abc,bcd,cde, def, efg, fga, gabの7つの10進表記を作り,それらを使用せよ.
C:\workC>sml2_trwin.exe test_valass.txt
0: nop -1
1: ldi 0
2: read -1
3: nop -1
4: ass 11
5: ldi 0
6: val 11
7: print -1
8: del -1
9: halt -1
Executing program...
+exec_inst: pc=0, stack_ptr=0, inst=nop, opr=-1
stack=<>
mem[0..20]=0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-exec_inst: pc=1, stack_ptr=0, inst=nop, opr=-1
stack=<>
mem[0..20]=0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+exec_inst: pc=1, stack_ptr=0, inst=ldi, opr=0
stack=<>
mem[0..20]=0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-exec_inst: pc=2, stack_ptr=1, inst=ldi, opr=0
stack=<0, >
mem[0..20]=0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+exec_inst: pc=2, stack_ptr=1, inst=read, opr=-1
stack=<0, >
mem[0..20]=0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
? 1
-exec_inst: pc=3, stack_ptr=2, inst=read, opr=-1
stack=<1, 0, >
mem[0..20]=0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+exec_inst: pc=3, stack_ptr=2, inst=nop, opr=-1
stack=<1, 0, >
mem[0..20]=0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-exec_inst: pc=4, stack_ptr=2, inst=nop, opr=-1
stack=<1, 0, >
mem[0..20]=0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+exec_inst: pc=4, stack_ptr=2, inst=ass, opr=11
stack=<1, 0, >
mem[0..20]=0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
data = 1.
mem_addr = 11.
data 1 stored to mem[11].
-exec_inst: pc=5, stack_ptr=0, inst=ass, opr=11
stack=<>
mem[0..20]=0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+exec_inst: pc=5, stack_ptr=0, inst=ldi, opr=0
stack=<>
mem[0..20]=0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-exec_inst: pc=6, stack_ptr=1, inst=ldi, opr=0
stack=<0, >
mem[0..20]=0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+exec_inst: pc=6, stack_ptr=1, inst=val, opr=11
stack=<0, >
mem[0..20]=0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
mem_addr = 11.
mem[11] = 1 pushed.
-exec_inst: pc=7, stack_ptr=1, inst=val, opr=11
stack=<1, >
mem[0..20]=0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+exec_inst: pc=7, stack_ptr=1, inst=print, opr=-1
stack=<1, >
mem[0..20]=0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1
-exec_inst: pc=8, stack_ptr=1, inst=print, opr=-1
stack=<1, >
mem[0..20]=0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+exec_inst: pc=8, stack_ptr=1, inst=del, opr=-1
stack=<1, >
mem[0..20]=0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-exec_inst: pc=9, stack_ptr=0, inst=del, opr=-1
stack=<>
mem[0..20]=0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
(debug): stack_ptr = 0; If non 0, something is WRONG!
Execution terminated.
ちなみに
val 新規 配列の先頭となる mem[]の番地 operandの値(array_base)にstack topの値(disp)を加えた値(mem_addr=array_base+disp)で示されるmem[]の番地に格納されている値(mem[mem_adr])をstack topに移動し,pcを1増やす.(stack topの値は上書きされて, mem[mem_adr]に等しくなる)stack_ptrは変化しない.
ass 新規 配列の先頭となる mem[]の番地 operandの値(array_base)にstack topの1つ下の値(disp = stack[stack_ptr - 1])を加えた値(mem_addr = array_base + disp)で示されるmem[]の番地(mem[mem_adr])に,stack topの値(v)を格納し,stack_ptrを2減らす.pcを1増やす.
assv 新規 配列の先頭となる mem[]の番地 operandの値(array_base)にstack topの1つ下の値(disp = stack[stack_ptr - 1])を加えた値(mem_addr = array_base + disp)で示されるmem[]の番地(mem[mem_adr])に,stack topの値(v)を格納し,さらに値(v)をstack topの一つ下(stack[stack_ptr - 1])に格納する.stack_ptrは 1減らす.※注:pcの増加数の違いを除けば,assvは ass命令を実行後,元stack topに在った値 vを再度pushすることに相当する.ただし,ass命令実行後には vは mem上にあり stack上には無くなっているので,assv命令を使用しない場合には,v自体を知っている,もしくは memの何処に格納したかを知っていることが必要である.