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;
}
Другие вопросы по тегам