1. ホーム
  2. assembly

[解決済み] ループ内で配列の個々の要素にアクセスするにはどうしたらよいですか?

2022-02-19 16:55:55

質問内容

私は配列のセルを印刷する必要があります、私は単語"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

lb $a0, $s0($t0) という命令を、数字だけでなく、いつでもインクリメントできるレジスタで使う方法はないでしょうか?

どのように解決するのですか?

の各要素にアクセスするには array というように使うことができます。

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


arrayがバイト配列の場合、みたいな。

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

にアクセスして、i th 要素を使用します。

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

というのは、各要素は1バイトなので、i にアクセスするには th バイトのアドレスにアクセスします。 i のアドレスへのオフセット array .

としてアクセスすることもできます。

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


arrayがワード配列の場合、みたいな。

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

にアクセスして、i th 要素を使用します。

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

というのは、各要素は4バイトで、iにアクセスするために th 要素に移動する必要があります。 i*4 の開始アドレスから1バイト 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)


例1:

.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