繁体   English   中英

如何使用移位从 MIPS32 程序集中的 4 字节字符串中删除字符?

[英]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字对齐,因此您可以安全地lwsw一次加载所有 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM