c - 这个 MIPS strlen 是否从相应的 C 循环正确转换而来?

标签 c assembly mips

我有一个关于 Comp Sci 类的简单问题,我的任务是将函数转换为 MIPS 汇编语言。我相信我有一个正确的答案,但我想验证它。

这是C函数

int strlen(char *s) {
     int len;

     len=0;
     while(*s != '\0') {
          len++;
          s++;
     }
     return len;
}

谢谢!

strlen: 
    add $v0, $zero, $zero     # len = 0
loop:                          # do{
    lbu $t0, 0($a0)               # tmp0 = load *s
    addi $a0, $a0, 1              # s++
    addi $v0, $v0, 1              # len++
    bne $t0, $zero, loop         # }while(tmp0 != 0)
s_end:
    addi $v0, $v0, -1        # undo counting of the terminating 0
    j $ra 

最佳答案

是的,你有一个正确的 asm 版本,我喜欢你在测试 t0 的值之前做尽可能多的工作,以便为从内存加载提供尽可能多的时间。

关于c - 这个 MIPS strlen 是否从相应的 C 循环正确转换而来?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5751463/

相关文章:

c - 字符串的插入排序(降序)

c++ - 将 DKM 项目链接到内核镜像 (VIP) 项目作为 VxWorks Workbench4 中的子项目/额外模块

c++ - C/C++ 以十六进制打印字节,得到奇怪的十六进制值

assembly - 实模式 x86 ASM : How are the Basics Done?

assembly - 在MIPS中,有符号加法、无符号加法、有符号减法和无符号减法有什么区别?

assembly - 如何转换 Mips 伪指令?

c - 我们是否需要释放 GLIB 列表中的每个元素

assembly - 为什么 Rust 编译器不能优化掉 Box::downcast 的错误部分?

assembly - 多定义符号 masm 5.0

c - 将C代码转换为汇编语言