Как да заредя цяла дума в регистър, за да мога да тествам функциите си в MIPS?

Опитвам се да тествам моята функция за дължина на низ в mips. Искам да го тествам с дума като "щастлив" или нещо подобно..... но не знам как да направя това. Би било чудесно да се научите и как да го отпечатате на екрана.

Това е моят код:

.globl StringLength

StringLength:
li $t0,0

StringLengthLoop:
lb $t1,0($a0)
beq $t1,$zero, StringLengthExit
add $a0,$a0,1
add $t0,$t0,1
j StringLengthLoop

StringLengthExit:
move $v0, $t0
jr $ra

person user977154    schedule 02.03.2012    source източник


Отговори (1)


За да печатате в конзолата, ще трябва да използвате едно от многото системни извиквания, налични във вашата система. (Точните стойности на системното извикване зависят от вашата система/емулатор.)

Низ може да бъде поставен в сегмента с данни на вашия изпълним файл с етикет, който може да се използва за получаване на адреса на началото на низа. ".ascii" означава ненулев завършващ низ, докато ".asciiz" означава нулев завършващ низ.

Ето прост пример за това как да отпечатате низ и цяло число:

        .data
str:    .asciiz "This is a string\n"  # a null-terminated string to be printed.
        .align 2                      # make sure it's aligned to word boundary
int:    .word 1234                    # some number

        .text
        .global main
main:
        la    $a0, str        # load the address of the start of our string
        li    $v0, 4          # syscall 4 usually means print string
        syscall

        la    $t0, int        # the address of our number
        lw    $a0, 0($t0)     # get our number
        li    $v0, 1          # syscall 1 usually means print int
        syscall

        li    $v0, 10         # syscall 10 usually means exit
        syscall               # exit.

Един по-практичен пример:

Ако трябваше да използвам вашата функция, тя би изглеждала по следния начин: (Ако приемем, че следва стандартната конвенция за извикване на аргументи в $aN и върната стойност в $vN. Което наистина е така.)

        .data
str:    .asciiz "This is an example"

        .text
        .global main
main:
        la    $a0, str        # first argument, a pointer to the string
        jal   StringLength    # call StringLength(str)

        # print the length
        add   $a0, $zero, $v0
        li    $v0, 1
        syscall

        li    $v0, 10
        syscall               # exit

Повечето емулатори използват едни и същи системни извиквания. Ето списък със системни повиквания за симулатора MARS.

Последна забележка: Ако планирате да заредите стойност с помощта на инструкцията lw, не забравяйте да кажете на асемблера да я подравни към границата на думата (.align 2), както направих с първия пример.

person Wiz    schedule 02.03.2012