2015-06-16 2 views
0

Мне нужно напечатать ячейки массива, у меня есть массив, который содержит слово «HELLO_WORLD», мне удается распечатать индекс самостоятельно, но я не могу распечатать все ячейки один за другим, вот код:Как я могу получить доступ к отдельным элементам массива в цикле?

loop: 
la $t0, hexdigits   # address of the first element 
lb $a0, 5($t0)   # hexdigits[10] (which is 'A') 
li $v0, 11 #system call service 
syscall 
addi $a0, $a0, 2 
li $v0, 11     # I will assume syscall 11 is printchar (most simulators support it) 
syscall      # issue a system call 
j end 

есть в любом случае использовать инструкцию фунтового $ a0, $ s0 ($ t0) с регистром, что я могу в любое время возрастать после я хочу? а не просто число?

+1

возможно дубликат [char array в MIPS] (http: // stack overflow.com/questions/10021039/char-array-in-mips) – mclark1129

+0

Я видел сайт, и это помогло немного, но теперь я застрял в печати ячеек один за другим, я обновил вопрос, надеюсь, вы видите Это. – MuhammadNe

+0

Благодарим за обновление вопроса, я обновил заголовок, чтобы больше соответствовать текущему вопросу. Это не дубликат вопроса, который я опубликовал, поэтому я откажусь от своего голоса. – mclark1129

ответ

2

Чтобы получить доступ к любому отдельному элементу array, вы можете использовать его как:

la $t3, array   # put address of array into $t3 

Если массив является массив, как:

array: .byte 'H','E','L','L','O' 

для доступа к я тыс Элемент:

lb $a0, i($t3)  # this load the byte at address that is (i+$t3) 

, потому что каждый элемент имеет 1 байт, поэтому для доступа к байту th обращайтесь по адресу i, смещенному по адресу array.

Вы также можете получить доступ к нему, как:

addi $t1,$t3,i 
lb $a0,0($t1) 

Если массив является слово массива, как:

array: .word 1,2,3,4,5,6,7,8,9 

для доступа к я я элемента:

lw $a0, j($t3)  #j=4*i, you will have to write j manually 

потому что каждый элемент, если из 4 байтов и для доступа к элементу th, вам нужно будет переместить i*4 байт с начального адреса array.

Существуют также некоторые другие способы доступа к нему:

li $t2, i   # put the index in $t2 
add $t2, $t2, $t2 # double the index 
add $t2, $t2, $t2 # double the index again (now 4x) 
add $t1, $t3, $t2 # get address of ith location 
lw $a0, 0($t1) 

example1:

.data 
array: .byte 'H','E','L','L','O','_','W','O','R','L','D' 
string: .asciiz "HELLO_WORLD" 
size: .word 11 
array1: .word 1,2,3,4,0,6,7,8,9 

.text 
.globl main 
main: 
    li $v0, 11 

    la $a2,array 

    lb $a0,0($a2)  #access 1st element of array or array[0] 
    syscall 
    lb $a0,1($a2)  #access 2nd element of byte array or array[1] 
    syscall 
    lb $a0,2($a2)  #access 3rd element of byte array or array[2] 
    syscall 
    lb $a0,10($a2)  #access 11th element of byte array or array[10] 
    syscall 
    li $a0,10 
    syscall 
    syscall 
    li $v0,1 
    la $a3,array1 
    lw $a0,0($a3)  #access 1st element of word array or array[0] 
    syscall 
    lw $a0,4($a3)  #access 2nd element of word array or array[1] 
    syscall 
    lw $a0,8($a3)  #access 3rd element of word array or array[2] 
    syscall 
    lw $a0,12($a3)  #access 4th element of word array or array[3] 
    syscall 
    jr $ra 

Пример: Печать байтовый массив:

li $v0, 11 
    la $a2,array 
    lw $t0,size 
loop1:       #print array 
    lb $a0, 0($a2)    #load byte at address stored in $a2 
    syscall 
    add $t0,$t0,-1 
    add $a2,$a2,1    #go to the next byte, since it is a byte array it will go to the address of next element 
#to use it for printing word array instead of adding 1 add 4 
    bgtz $t0, loop1 
+0

Это действительно работает, проблема, которую я имел, делала смещение, спасибо за решение и отличное объяснение. – MuhammadNe

1

Вот моя лучшая попытка решить, за что вы находитесь.

.data 
mystring: .ascii "HELLO_WORLD" 

.text 
la $t0, mystring # Load the array 
li $t1, 0   # Create the loop counter 
li $v0, 11  # Syscall code for print character  

loop: 

    add $t2, $t0, $t1 # Load the address for the element at the current index 
    lb $a0, 0($t2)  # Load the value of the array at the current index into $a0 
         # (For printing) 

    beqz $a0, exit  # If the value at the current index is null, you have 
         # reached the end of the string, so exit out 

    syscall    # Print the character in $a0 (Syscall code in $v0: 11) 

    addi $t1, $t1, 1  # Increment the counter 

    j loop    # Jump to the beginning of the loop  

exit: # Should be reached once you have hit the end of the string 

Отказ от ответственности: Я не знаю сборки MIPS, я попытался забрать столько, сколько я мог бы исследовать ваш вопрос. Я мог проверить эту программу только в онлайн-эмуляторе, который не поддерживал печать на экране (syscall). Не просто слепо вставить этот код и ответить «Нет, не работает». Если есть какие-либо проблемы, попробуйте быть конкретными, и я постараюсь выяснить проблему.

+0

Спасибо, он работает хорошо. – MuhammadNe

Смежные вопросы