我只是想知道,MIPS 中是否有任何方法可以将数字总和存储为字符串,然后逐字节读取它们,例如:
总和 657 -> sw 到 .ascii 指令中 -> 后来在第一个索引上 lb 得到 6(在 ascii 代码中)与 5 相同,依此类推。这可能吗?
我认为 ShinTakezou 的回答有缺陷。 行负 $a0, $a0 会将正数转换为负数,这会导致代码输出奇怪的结果。 如果我们删除这一行。这些代码对于正整数工作正常
当然。 “.ascii”指令只不过是一个专注于 ASCII 文本存储的 .byte 指令
.ascii“PP”
就像
.字节80,80
您可以使用
.space
为 ASCII 字符串腾出空间,然后在从整数到 ASCII 的转换中使用缓冲区,如果您的意思是整数的“sw into .ascii 指令”。以下代码使用 itoa 将“二进制数”转换为 ASCII 字符串,并使用 print_string 打印它(仅用于测试)。该函数使用缓冲区并将指针返回到可用于打印的第一个 ASCII 数字。这可以用作类似 sprintf 的函数实现的第一个辅助函数。
.data
buffer:
.space 32
.text
# the main supposes env. like spim or MARS
main:
li $a0, 1234 # a number
jal itoa
move $a0, $v0
li $v0, 4 # print_string
syscall
li $v0, 10
syscall # exit
itoa:
la $t0, buffer+30 # pointer to almost-end of buffer
sb $0, 1($t0) # null-terminated str
li $t1, '0'
sb $t1, ($t0) # init. with ascii 0
li $t3, 10 # preload 10
slt $t2, $a0, $0 # keep the sign
beq $a0, $0, iend # end if 0
bgtz $a0, loop
neg $a0, $a0 # absolute value (unsigned)
loop:
div $a0, $t3 # a /= 10
mflo $a0
mfhi $t4 # get remainder
add $t4, $t4, $t1 # convert to ASCII digit
sb $t4, ($t0) # store it
subu $t0, $t0, 1 # dec. buf ptr
bne $a0, $0, loop # if not zero, loop
addiu $t0, $t0, 1 # adjust buf ptr
iend:
beq $t2, $0, nolz # was < 0?
addiu $t0, $t0, -1
li $t1, '-'
sb $t1, ($t0)
nolz:
move $v0, $t0 # return the addr.
jr $ra # of the string
在 main 中有 $v0 后,
lb R, ($v0)
选择“1”,lb R, 1($v0)
选择第二个数字 (2),依此类推;请记住该字符串以 null 结尾,因此如果您选择 0(数字),则必须停止