将 C 代码转换为 MIPS

标签 c mips

我有以下 C 代码需要转换为 MIPS:

#include <stdio.h>

int main()
{
     // Two strings, 100 bytes allocated for each
     char s1[100];
     char s2[100];

     printf("Enter string 1: ");
     scanf("%s", s1);

     printf("Enter string 2: ");
     scanf("%s", s2);

     int index = 0;
     while (1)
     {
         // Load characters from s1 and s2
         char c1 = s1[index];
         char c2 = s2[index];

         // Current character is greater for s1
         if (c1 > c2)
         {
             printf("s1 > s2\n");
             break;
         }

         // Current character is greater for s2
         if (c1 < c2)
         {
             printf("s1 < s2\n");
             break;
         } 

         // End of strings reached
         if (c1 == 0)
         {
            printf("The strings are equal\n");
            break;
         }

         // Compare next character
         index++;
     }
} 

这是我到目前为止所拥有的:

.data  
s1: .space 100  
s2: .space 100 
enters1: .asciiz "Enter string 1: "  
enters2: .asciiz "\nEnter string 2: "  
equalprint: .asciiz "The strings are equal\n"  
s2lessthans1: .asciiz "\ns1 > s2\n"
s1lessthans2: .asciiz "\ns1 < s2\n"  

.text
.globl main

main:  
li $v0,4         
la $a0,enters1  
syscall

li $v0,8
la $a0,s1
addi $a1,$zero,20
syscall         

li $v0,4        
la $a0,enters2
syscall

li $v0,8
la $a0,s2
addi $a1,$zero,20
syscall         

la $a0,s1             
la $a1,s2                    
jal compare   

beq $v0, $0, equalprint
slt $t0, $v0, $0
bne $t0, $0, str1smallerprint
j str2smallerprint

end:
    addi $v0, $0, 10
    syscall

compare:
    add $t1, $s0, $t0
    lbu $t2, 0($t1)
    add $t1, $s1, $t0
    lbu $t3, 0($t1)
    slt $t4, $t2, $t3
    bne $t4, $0, str1smaller
    beq $t2, $0, equal
    addi $a0, $t2, 0
    li $v0, 11
    syscall
    addi $t0, $t0, 1
    j compare

str1smaller:
    addi $v0, $0, -1
    jr $ra

str2smaller:
    addi $v0, $0, 1
    jr $ra

equal:
    addi $v0, $0, 0
    jr $ra

equalstrings:
    la $a0, equalprint
    li $v0, 4
    syscall
    j end

str1smallerprint:
    la $a0, s1lessthans2
    li $v0, 4
    syscall
    j end

str2smallerprint:
    la $a0, s2lessthans1
    li $v0, 4
    syscall
    j end

当我在 MARS MIPS 上组装并运行时,它说组装成功,但是第 16 行

lbu $t2, 0($t1)

有错误:

Error in line 47: Runtime exception at 0x00400078: address out of range 0x00000000

我不确定哪里出了问题,或者需要修复什么才能消除此错误,有什么帮助吗?

编辑:固定代码

.data 
s1: .space 100 
s2: .space 100 
enters1: .asciiz "Enter string 1: " 
enters2: .asciiz "\nEnter string 2: " 
equalprint: .asciiz "The strings are equal\n" 
s2lessthans1: .asciiz "\ns1 > s2\n"
s1lessthans2: .asciiz "\ns1 < s2\n"

.text
.globl main

main: 
li $v0, 4 
la $a0, enters1 
syscall

li $v0, 8
la $a0, s1
addi $a1, $0, 100
syscall

li $v0, 4 
la $a0, enters2
syscall

li $v0, 8
la $a0, s2
addi $a1, $0, 100
syscall

loop:
    lb $t1,s1($t0)
    lb $t2,s2($t0)
    blt $t1,$t2,s2lts1
    bgt $t1,$t2,s1lts2
    beq $t1,$0,s1eqs2
    addi $t0,$t0,1
    j loop

s1lts2:
    li $v0, 4 
    la $a0, s1lessthans2
    syscall
    j end

s2lts1:
    li $v0, 4 
    la $a0, s2lessthans1
    syscall
    j end

s1eqs2:
    li $v0, 4 
    la $a0, equalprint
    syscall

end:
    li $v0, 10
    syscall

最佳答案

如果你追踪代码,在你点击lbu的那一刻,t0s0都没有被初始化,并且如果MARS将您的寄存器初始化为 0,那么是的,您的 t1 将最终成为 NULL 指针。

关于将 C 代码转换为 MIPS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35713193/

相关文章:

assembly - MIPS 汇编语言 - 临时寄存器与保存的寄存器

c++ - 如何使用 Windows API 检查网络连接类型?

协调多个进程之间共享监听套接字的接受

使用 "push"而不使用 "pop"的 mips 代码

caching - 缓存行锁定

assembly - MIPS 跳转和分支指令范围

java - 使用加法和移位 : translating from Java to MIPS 的乘法

c++ - 用子类定义类数组

c - 在 C 中获取 switch-case 中的 case 数量

c - Visual Studio 中的 DirectX