[英]How to remove a char from a 4-byte string in MIPS32 assembly using a shift?
我是 MIPS32 程序集的新手,并试图删除存储在 .data 部分中的字符串中的一个字符(特别是删除第一个字符),但不知道该怎么做。
在下面的代码行中,有没有办法让 test 等于“bc”而不是“abc”
test: .asciiz "abc"
这仅仅是使用逻辑左移2来删除第一个字符的问题,还是我需要抵消一些东西,或者是否有一个操作码可以直接删除它?
正如需要从汇编中的字符串中删除所有非字母元素(对于 x86)所解释的那样,删除字符串中的字符意味着复制字符串的整个 rest。
在您的情况下,4 个字节中只剩下 3 个字节(包括终止的0
)。 所以是的,你可以通过将单词移动 8 位(1 个字节)来做到这一点。 特别是如果您确保test
与之前的.p2align 2
字对齐,因此您可以安全地lw
和sw
一次加载所有 4 个字节。
对于 little-endian MIPS(如 MARS 模拟),这将是一个右移,因为 memory 中的第一个字节是最不重要的。 右移移出低(最低有效)位。
对于大端 MIPS(最高有效字节在前,就像一些真正的 MIPS CPU 一样),这将是左移,移除最高有效字节并将低位向上移动。
请注意,这将使test
中的单词为'b', 'c', 0, 0
。 所以是的,作为隐式长度字符串,它是"bc"
。
另请注意,如果您在寄存器中只有一个指针,则只需将其增加 1 即可获得指向"bc"
的指针,而不是修改 memory。 像addiu $t0, $t0, 1
。
或者等价地, la $t0, test+1
是指向开始后 1 个字节的指针。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.