根据规范,我的输出应该是这样的:
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 个汇编子例程,一个进行十六进制转换,一个从测试程序中获取要打印的数字,现在我得到的输出开始类似于它应该看起来的样子:
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(十六进制 0x53) 内存位置 0x0047115 包含二进制值 0001 0110(十六进制 0x16) 内存位置 0x0047116 包含二进制值 0000 0000(十六进制 0x00) 内存位置 0x00047110 包含二进制值(十六进制 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
任何帮助是极大的赞赏。