如何在循环中访问数组的各个元素?

时间:2015-06-16 13:14:15

标签: assembly mips

我需要打印一个数组的单元格,我有一个包含单词“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)和一个我可以随时增加的寄存器吗?而不只是一个数字?

3 个答案:

答案 0 :(得分:3)

要访问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的起始地址移动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

答案 1 :(得分: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汇编,我试着尽可能多地研究你的问题。我只能在一个不支持打印到屏幕的在线模拟器中测试这个程序(系统调用)。 不要盲目地粘贴此代码并回复#34;不,不工作" 。如果有任何问题请尝试具体,我会尝试找出问题。

答案 2 :(得分:0)

我是Mips assebly的初学者,但据我了解,我认为您可以这样做:
数组的每个元素都有4个字节(实际上可能更少,但没有其他元素可以在这4个字节上存储任何内容,这些仅用于一个元素)。
因此,在两个元素k,k + 1的地址之间,始终有4个字节的距离。
如上所述,如果要到达第i个元素,则需要在第一个元素(A [0])的地址中添加4 * i的偏移距离。
除了mul指令之外,创建此偏移距离的一种方法是:

sll $t1, $t0, 2

这实际上意味着“将寄存器$ t0中的值左移2位(其余部分用0填充)并将结果存储在寄存器$ t1中。但是您可以很容易地注意到,如果向左移位并填充零,对于每个班次,您实际上会将当前值乘以2(请注意,如果我们知道我们有足够的空间,请使用此值,以避免发生浮动)

因此,例如,如果在$ t0中,您在$ t1中有0001,您将获得0100 所以基本上:您需要

sll $t1, $t0, 2 # [t1]=4i
lb $a0, t1($t0)  # a0 = A[i]

*如果您是经验丰富的Mips程序员,但我错了,请编辑我的帖子或评论,以确保我们每个人都变得更好