如何在分配的空间中存储以 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 &lt;= string.len() 是错误的结束条件。它应该是x &lt; string.len(),因为你从 0 开始。

【讨论】:

@tum_ 分支很好,只是它偏离了一个(当string.len() &lt; x,即x &gt; string.len()时,它跳转到Exit)。 也许我解释错了。我的问题不在于流程,而是在指令sb $t0, 0($s4) 中,它不会以我想要的方式将寄存器$t0 中的内容存储在缓冲区中。 . @Kenyskrachor:我已经用我的更改测试了代码,它可以正常工作。您必须明确说明不按您想要的方式存储的意思。 对于小于 10 的值,您可以在存储之前添加 '0'。对于较大的值,它有点复杂。 ..或从一开始就将 $t0 设置为 0x30 ('0'),但随后您需要调整退出条件和/或 $s2 内容。在任何情况下,将索引存储为 ASCII 是很奇怪的,但那是你的程序,所以你是老板。 :)

以上是关于如何在分配的空间中存储以 ASCII 转换的计数器寄存器中包含的值的主要内容,如果未能解决你的问题,请参考以下文章

六操作系统——内存管理的概念(空间的分配与回收空间的扩充地址转换存储保护)

竞赛(变量定义赋值及转换)

如何在字符 ASCII 字符串中以数字形式转换 java id? [复制]

如何使用 ASCII 数据分配字符?

Swift 之计数排序

Linux的内核空间和用户空间是如何划分的(以32位系统为例)?