assembly - 没有 lb 和偏移量的 Mips 字符串字符操作
问题描述
我是 MIPS 的新手,我试图弄清楚如何在没有 lb/sb 和偏移量的情况下操作字符串中的单个字符。我已经知道如何通过加载字符串的地址并通过增加偏移量来循环执行此操作,但是如果我只有一个字符寄存器怎么办?假设我有一个包含几个字符的寄存器。我如何访问每个字符并将其设为大写。我知道我必须将字符减去 32 才能使其大写,但是我在遍历字符时遇到了麻烦。如果我转移,我最终不会失去角色吗?像这样:
add $t0, $t0, 1
subi $t0, $t0, 32
add $t0, $t0, 1
等等。遍历每个角色的正确方法是什么?
解决方案
不使用加载操作就无法访问内存。如果您想lw
在字符串上使用字大小的加载操作 ( ),您将受到为这些指令使用对齐地址的要求的限制(在 MIPS 上——其他处理器将以最小的性能损失执行未对齐的访问)。
如果我们可以依赖从对齐边界开始的所有字符串并且始终是 4 字节长的倍数,那么处理对齐要求就不是那么难了。移除长度限制(4 的倍数)会增加复杂性,就像移除初始对齐限制(4 的倍数)一样。对于通用解决方案,这两个对齐问题都需要解决,这意味着区分多种情况以使用字大小的操作。
如果您确实在一个寄存器中有 4 个字符,并且您想调整(即大写)每个不同的 4 个字节,那么您几乎必须单独查看它们。真的没有办法立即计算要添加的值,它将大写每个字节。
需要明确的是,对于任何给定的 4 个字符的 4 字节值,可以添加一个 32 位调整值,以便一次将 4 个字节中的每一个都大写 - 但是有 16 个可能的这样的值,并且对于任何给定的 4 字节值,没有简单的方法可以确定 16 个中的哪一个是正确的。 因此,您必须提取每个字节并单独考虑它,这几乎与直接使用lb
/一样有效sb
。
推荐阅读
- javascript - 为什么javascript中有未处理的“错误”事件
- java - 使用类方法更改布尔变量的值?
- c - 为什么在特定情况下需要 memcpy
- python-3.7 - 对 lambda 函数的不同行为感到困惑
- python - 将用户(浮点值)输入分配到空列表 Python
- swift - sudo 将文件从 swift 丢弃到用户的垃圾箱
- javascript - 使用Javascript自动格式化驾驶执照?
- audio - 在调整音量的同时将两个音频文件与 sox 合并
- amazon-ec2 - apache atlas 服务器的连接被拒绝
- python - 如何使用 ECDSA secp256k1 曲线在 python 中签名消息的方式与在 Javascript 中签名的方式相同?