所以这是我的代码与给定的参数;这就是我的代码最终打印出来的。
测试功能_strCopy
请输入字符串:test
您刚刚输入:test
_strCopy的结果: 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
如果两个字符串相同,则_strCopy正常工作。
老实说,汇编给了我最大的麻烦,我认为考虑到大部分代码已经完成,我认为这很容易,我只需要完成这些功能。任何帮助将不胜感激。
Edit1:删除了不需要的行 Edit2:解决了,不得不改变
move $t0, $a0
move $t1, $a1
到
move $t0, $a1
move $t1, $a0
并且修复了它
# Arguments:
# - $a0: An address of the first character of a source string
# - $a1: An address of a buffer
# Return Value:
# - None
_strCopy:
move $t0, $a0
move $t1, $a1
strCopy_loop:
lbu $t3, 0($t1) # load
sb $t3, 0($t0) # write
addi $t0, $t0, 1
addi $t1, $t1, 1
beq $t3, $zero, __strCopy_end # Return if we hit a null terminator
j strCopy_loop
__strCopy_loop2:
addi $t2, $t2, -1
sb $zero, 0($t2)
__strCopy_end:
sub $v0, $t0, $a0
jr $ra
答案 0 :(得分:0)
另一种可能的实现方式:
.globl my_strcpy
.ent my_strcpy
my_strcpy:
// Arguments:
// a0: new str
// a1: source str
// a2: number of chars to copy
li $t0, 0 // New str
li $t1, 0 // Source str
li $t2, 0 // Char to copy
li $t3, 0 // Chars copied
for:
addu $t1, $a1, $t3 // Point to next char of source str
lb $t2, 0($t1) // Get next char of source str
addu $t0, $a0, $t3 // Point to next char of new str
sb $t2, 0($t0) // Save next char of new str
addi $t3, $t3, 1 // +1 chars copied
bne $a2, $t3, for // Continue if there are more chars
jr $ra // Back to caller
.end my_strcpy
可以在C脚本上进行如下测试:
#include <stdio.h>
extern void my_strcpy( char* d, char* s, size_t n );
void check( char* a, char* b, size_t n ){
for( size_t i = 0; i < n; i += 1 ){
if( a[i] != b[i] ){
printf( "NOT OK \n" );
return;
}
}
printf( "OK \n" );
}
int main(){
char s[14] = "String sample"; // null terminator
char d[14];
my_strcpy( d, s, 14 );
check( d, s, 14 );
return 0;
}