Assembly 如何在这里输出第二个数字?
根据规范,我的输出应该是这样的:Assembly 如何在这里输出第二个数字?,assembly,mips,nios,Assembly,Mips,Nios,根据规范,我的输出应该是这样的: 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 等等。我已经编写了两个汇编子程序,一个进行十六进制转换,另一个从测试程序中获取要打印的数字,现在我得到的输出开始类似于它应该是什么样子: 0: 1: 2: 3: 4: 5: 6: 7: 8: 9: A: B: C
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
等等。我已经编写了两个汇编子程序,一个进行十六进制转换,另一个从测试程序中获取要打印的数字,现在我得到的输出开始类似于它应该是什么样子:
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)内存位置
0x0047117包含二进制值0000 0000(十六进制0x00)
调用者将寄存器r4设置为0x0047114并调用puttime;油灰印花
16点53分换了一条新线路
我最近发布的其他问题也提供了更多的背景信息,这些问题都是相同的作业,但重点是作业的其他部分:
我的转换程序是:
.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
非常感谢您的帮助 我认为您需要调用hexasc两次,输入数据中的每个十六进制数字调用一次。您需要在每次调用hexasc时将输入数据右移4位,因为hexasc只转换输入数据的底部4位 顺便说一下,使用PUSH和POP并不是惯用的MIPS代码。在MIPS中,通常在进入例程时从堆栈指针中减去一个常量值,然后在退出路由时再加上该常量值。像这样:
puttime:
subi sp, 8 # reserve space for 2 words on the stack
sw r31, 4(sp)
...
lw r31, 4(sp)
addi sp, 8
ret