仕様によると、私の出力は次のようになります。
00:00
00:01
00:12
01:23
12:34
23:45
34:56
45:67
56:78
67:89
78:9A
89:AB
9A:BC
AB:CD
BC:DE
CD:EF
DE:F0
EF:01
F0:12
01:23
12:34
等々。私は 2 つのアセンブリ サブルーチンを作成しました。1 つは 16 進数の変換を行い、もう 1 つはテスト プログラムから出力する数字を取得します。現在、次のような出力が得られています。
0:
1:
2:
3:
4:
5:
6:
7:
8:
9:
A:
B:
C:
D:
E:
F:
0:
1:
2:
3:
4:
5:
だから、一番右の数字を正しく取得しているように見えますが、残りの数字を取得するにはどうすればよいですか? 宿題にそう書いてある
例: メモリ位置 0x0047114 にはバイナリ値 0101 0011 (16 進数 0x53) が含まれます メモリ位置 0x0047115 にはバイナリ値 0001 0110 (16 進数 0x16) が含まれます メモリ位置 0x0047116 にはバイナリ値 0000 0000 (16 進数 0x00) が含まれます(16 進数 0x00) 呼び出し側はレジスタ r4 を 0x0047114 に設定し、puttime を呼び出します。puttime は、新しい行に 16:53 を出力します。
私が最近投稿した同じ課題であるが、その他の部分に焦点を当てている他の質問から、より多くの背景が利用できます。
https://stackoverflow.com/questions/12105322/how-to-proceed-coding-for-this-assignment
https://stackoverflow.com/questions/12152323/why-is-load-word-not-working
変換を行う私のプログラムは次のとおりです。
.global hexasc
.text
.align 2
hexasc: movi r8, 0x09
movi r9, 0x0f
andi r4, r4, 0x0f #keep only 4 bits
bgt r4, r8, L1 #is x>9?
movi r2, 0x30
add r2, r2, r4
andi r2, r2, 0xff
ret
L1: movi r2, 0x37
add r2, r2, r4
andi r2, r2, 0xff
ret
上記は正しく機能していると思いますが、変数を取得してサブルーチンに渡す中間部分をプログラムする方法がわかりません。
.macro PUSH reg
subi sp, sp, 4
stw \reg, 0(sp)
.endm
.macro POP reg
ldw \reg, 0(sp)
addi sp, sp, 4
.endm
.global puttime
.text
.align 2
puttime:
PUSH r31
ldw r8,0(r4) # put the variable in register 8
PUSH r8
nop
movi r4, 0x0A # put newline char in register 4
movia r9,putchar # copy subroutine address to a register
callr r9 # call subroutine via register
POP r8
mov r4, r8
call hexasc
mov r4, r2
movia r9,putchar # copy subroutine address to a register
callr r9
movi r4, 0x3A
movia r9, putchar
callr r9
POP r31
ret
どんな助けでも大歓迎です。