MIPS Strcpy распечатывает мусор
Итак, вот мой код с данным аргументом; это то, что мой код заканчивается печатью.
Тестовая функция _strCopy
Пожалуйста, введите строку: тест
Вы только что вошли: тест
Результат _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 ответов
Другая возможная реализация:
.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;
}