Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在C中实现相同算法的MIPS程序_C_String_Assembly_Mips - Fatal编程技术网

在C中实现相同算法的MIPS程序

在C中实现相同算法的MIPS程序,c,string,assembly,mips,C,String,Assembly,Mips,编写一个完整的MIPS程序,实现如下所示的相同算法(C)。要验证MIPS程序的输出,请复制此C代码并执行它 所以我需要把这个C代码转换成MIP代码 这是C代码 int main() { char string[256]; int i=0; char *result = NULL; // NULL pointer is binary zero // Obtain string from user, e.g. "Constantinople" scanf("%255s", s

编写一个完整的MIPS程序,实现如下所示的相同算法(C)。要验证MIPS程序的输出,请复制此C代码并执行它

所以我需要把这个C代码转换成MIP代码

这是C代码

int main()
{
  char string[256];
  int i=0;
  char *result = NULL;  // NULL pointer is binary zero

  // Obtain string from user, e.g. "Constantinople"
  scanf("%255s", string); 

  // Search string for letter 'e'.
  // Result is pointer to first e (if it exists)
  // or NULL pointer if it does not exist
  while(string[i] != '\0') {
    if(string[i] == 'e') {
      result = &string[i]; 
      break; // exit from while loop early
    }
    i++;
  }

  if(result != NULL) {
    printf("First match at address %d\n", result);
    printf("The matching character is %c\n", *result);
  }
  else
    printf("No match found\n");
}

这是我的Mips代码,我不知道如何获取输入,比较和打印结果


.globl main 
.text   
main:
    #$s0 : base address string
    #$s1 : i
    #$s2 : *result

    la $s0, string
    addi $s1, $zero, 0 
    addi $s2, $zero, 0 #*result = null  


    #get input from user
    li $v0 ,8 # take input
    la $a0, string # load byte space into address
    li $a1, 256 #allot the byte space for string
    move $t0, $a0
    syscall
    addi $t9, $s0, $s1 # &string[i]
    lb $t8,0($t9) #t8 = string [i]
while: beq $t8 , 0, outsidewhile # if string[i] == '\0'
    beq $t8, 101, body # if string i == 'e'
    add $s1, $s1,1 #i++
    j while
body: 
    add $t2, $t9, $zero #result = &string[i];   
    j outsidewhile

outsidewhile :
    beq $s2, 0, printaddress # if(result != NULL)
    # printf("No match found\n");
        li $v0,4
        la $a0, msg2        
        li $v0,4
        la $a0, newline 
printaddress:
    #printf("First match at address %d\n", result);
    #printf("The matching character is %c\n", *result);
    li $v0,4
    la $a0, msg     

li $v0, 10 
syscall

.data
string: .space 256
msg: .asciiz "First match at address "
msg1: .asciiz "The matching character is "
msg2: .asciiz "No match found"
endstring: .asciiz "\0"
newline: .asciiz "\n"
(谢谢你的发帖)。您似乎正在使用此系统调用定义()

就在while:loop中的beq指令之后,增加$s1。我记得MIPS CPU有一个计时错误,它总是在分支后执行指令。在这里,这意味着s1美元将比你想象的多出一美元。这同样适用于Jwhile,但这是无害的,因为它将在循环退出时重新执行

j outsidewhile对我来说似乎有点险恶,因为延迟槽中的操作码本身就是一个分支。不知道这是怎么解决的,但我不会诱惑这里的神

您需要添加代码来打印字符串、地址和字符,可能还有一个出口。
除此之外,它看起来还不错;但是您还需要进行一些调试。

在提供的代码的第19行,您正在对3个寄存器操作数使用
addi
addi
需要两个寄存器操作数和一个立即数,因此无法使用MARS编译/汇编(我没有尝试SPIM)


您的循环无法(重新)加载下一个字节,因此将
移到后面:
返回两条指令:由于您正在递增
$s1
,因此需要重新格式化
添加$t9$s0$s1
lb$t8($t9)
-否则,
$t9
不会更改地址,
$t8
也不会更改字节值。

发布代码,而不是图像。是否有足够的常见问题解答?我想你是在问有关MIPS asm的问题。。不是关于C。。不是吗??更改标签。。所以,其他人可以知道。对于C,您可以使用C标准库中的输入函数。。。对于ASM,您应该链接其他输入库并调用它。好吧,我的错,这里有一个C代码@PeterLee:关于MIPS的大多数问题都是使用MARS或SPIM来模拟一个带有玩具系统调用的系统,可以使用
syscall
指令进行整数和字符串输入和输出;不需要图书馆。OP的MIPS代码已经在使用
syscall
。这不是一个计时错误,而是一个称为分支的设计工件。对于像OP这样对低级编程相当陌生的人来说,这很可能不是幽默……他还应该知道,这些设计缺陷应该继续被视为时代错误。笑话必须有趣。分支延迟槽有一个真正的用途:完全隐藏分支延迟,而不需要分支预测。无论如何,SO上的大多数MIPS代码都是为MARS/SPIM编写的,它们的默认设置是模拟没有分支延迟槽的MIPS。(如果你不看反汇编/机器代码,你可以假装它像一个老式的MIPS汇编程序,重新排序你的代码以填充延迟槽,或者如果找不到任何东西,则填充
nop
)当然,在ISA中公开这一经典的MIPS管道/微体系结构细节对后来的超标量MIPS实现来说是一个负担,而这些实现必须保留这种行为。这仍然不会使它成为一个“计时错误”,它可以说是对第一代微体系结构的ISA的过早优化。还有为什么MIPS只具有简单的分支条件:例如,单个reg
bltz
(仅为符号位),或者仅用于两个reg
beq
bne
,而不是两个reg之间的
bgt
blt