如何在分配的空间中存储以 ASCII 转换的计数器寄存器中包含的值
Posted
技术标签:
【中文标题】如何在分配的空间中存储以 ASCII 转换的计数器寄存器中包含的值【英文标题】:How to store in an allocated space a value contained in a counter register converted in ASCII 【发布时间】:2019-05-03 08:03:29 【问题描述】:我有一个for
循环,它检查字符串中是否存在 Char,并将它的索引存储在另一个中,以这种方式:
伪代码:
for (x = 0; x < string.len(); x++)
if (string[x] == "A")
new_string.append(x)
这是我在 MIPS 中尝试过的
MIPS:
add $t0, $zero, $zero # $t0 is the counter
loop:
blt $s2, $t0, Exit # $s2 have the string.len()
add $s0, $s1, $t0 # point to the X char
# ($s1 is the string address)
lb $t1, 0($s0)
bne $t1, 0x41, endLoop # if $t1 != "A" continue
sb $t0, 0($s4) # store in newstring the X value
addi $s4, $s4, 1 # point to the next space of newstring
endLoop:
addi $t0, $t0, 1 # increment X
j loop
Exit:
在这种模式下,我将使用sb $t0, 0($s4)
将数字存储在缓冲区中。我需要将该值转换为 ASCII 表示形式。
输入字符串的最大长度可以是 256。所以我需要一个考虑这个限制的表示。
我需要 ASCII 表示,因为输出字符串将由其他函数处理,该函数使用 ASCII 属性加密输入字符串。
【问题讨论】:
【参考方案1】:当您增加目标地址时,您错误地使用了$s3
。应该是addi $s4, $s4, 1
另外,x <= string.len()
是错误的结束条件。它应该是x < string.len()
,因为你从 0 开始。
【讨论】:
@tum_ 分支很好,只是它偏离了一个(当string.len() < x
,即x > string.len()
时,它跳转到Exit
)。
也许我解释错了。我的问题不在于流程,而是在指令sb $t0, 0($s4)
中,它不会以我想要的方式将寄存器$t0
中的内容存储在缓冲区中。 .
@Kenyskrachor:我已经用我的更改测试了代码,它可以正常工作。您必须明确说明不按您想要的方式存储的意思。
对于小于 10 的值,您可以在存储之前添加 '0'
。对于较大的值,它有点复杂。
..或从一开始就将 $t0 设置为 0x30 ('0'),但随后您需要调整退出条件和/或 $s2 内容。在任何情况下,将索引存储为 ASCII 是很奇怪的,但那是你的程序,所以你是老板。 :)以上是关于如何在分配的空间中存储以 ASCII 转换的计数器寄存器中包含的值的主要内容,如果未能解决你的问题,请参考以下文章
六操作系统——内存管理的概念(空间的分配与回收空间的扩充地址转换存储保护)