没有 lb 和偏移量的 Mips 字符串字符操作

问题描述

我是 MIPS 的新手,我正在尝试弄清楚如何在没有 lb/sb 和偏移量的情况下操作字符串中的单个字符。我已经知道如何通过加载字符串的地址并通过增加偏移量来循环执行此操作,但是如果我只有一个字符寄存器怎么办?假设我有一个包含几个字符的寄存器。我如何访问每个字符并将其设为大写。我知道我必须将字符减去 32 才能使其大写,但是我在遍历字符时遇到了麻烦。如果我转移,我不会最终失去角色吗?像这样:

add $t0,$t0,1
subi $t0,32
add $t0,1

等等。遍历每个字符的正确方法是什么?

解决方法

不使用加载操作就无法访问内存。如果您想在字符串上使用字大小的加载操作 (lw),您将受到对这些指令使用对齐地址的要求的限制(在 MIPS 上 - 其他处理器将以最低性能进行未对齐访问罚)。

如果我们可以依赖从对齐边界开始的所有字符串并且始终是 4 个字节的倍数,那么处理对齐要求就不那么困难了。移除长度限制(4 的倍数)会增加复杂性,移除初始对齐限制(4 的倍数)也会增加复杂性。对于通用解决方案,这两个对齐问题都需要解决,这意味着区分多种情况以使用字大小的操作。


如果您在单个寄存器中确实有 4 个字符,并且您想调整(即大写)其不同的 4 个字节中的每一个,您几乎必须单独查看它们。真的没有办法立即计算要添加的每个字节的大写值。

需要明确的是,对于任何给定的 4 个字符的 4 字节值,只有一个 32 位调整值可以添加以便 一次将 4 个字节中的每一个大写 - 但是有 16 个可能的这样的值,并且没有简单的方法来确定 16 个中哪一个是任何给定的 4 字节值的正确值。 所以,你会必须提取每个字节并单独考虑,这几乎与直接使用 lb/sb 一样有效。