在C中实现相同算法的MIPS程序
编写一个完整的MIPS程序,实现如下所示的相同算法(C)。要验证MIPS程序的输出,请复制此C代码并执行它 所以我需要把这个C代码转换成MIP代码 这是C代码在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
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只具有简单的分支条件:例如,单个regbltz
(仅为符号位),或者仅用于两个regbeq
和bne
,而不是两个reg之间的bgt
或blt
,