在汇编中加载和存储单词
Loading and storing words in assembly
我不确定我的代码中到底发生了什么。当我尝试使用 lw
和 sw
交换数组中的值时出现问题。程序应该是对数组进行升序排序,然后输出。
.text
.globl __start
__start:
la $t0, array # t0 = address of array
lw $t1, count # t1 = count, exit loop when it goes to 0
loop:
lw $t2, ($t0) # t2 = element in array
lw $t4, count # t4 = count, for innerLoop
add $t3, $t0, 4 # t3 = address of next array element
innerLoop:
lw $t5, ($t3) # t5 = element in array
ble $t2, $t5, greater # if element in t2 is >= element in t5 goto greater
sw $t2, ($t3) # store element in t2 into the t3 array address
sw $t5, ($t0) # store element in t5 into the t0 array address
lw $t2, ($t0) # t2 = new element in t0 array address
greater:
add $t4, $t4, -1 # t1 -- -> counter --
add $t3, $t3, 4 # t3 = address of next array element
bnez $t4, innerLoop # if innerLoop count != 0 go to innerLoop
add $t1, $t1, -1 # t1 -- -> counter --
addi $t0, $t0, 4 # t0 = address of next array element
bnez $t1, loop # if loop count != 0 go to loop
la $t0, array # t0 = address of array
lw $t1, count # t1 = count, exit loop when it goes to 0
lw $t2, ($t0) # lw in address t0 into t2
move $a0, $t2 # Display the first element in array
li $v0, 1
syscall
add $t1, $t1, -1 # t1 -- -> counter --
add $t0, $t0, 4 # increment counter to point to next word
displayLoop:
lw $t2, ($t0) # t2 = next element in array
la $a0, comma # Display ", "
li $v0, 4 # a0 = address of message
syscall # v0 = 4 which indicates display a string
move $a0, $t2 # Display element in array
li $v0, 1
syscall
add $t1, $t1, -1 # t1 -- -> counter --
add $t0, $t0, 4 # increment counter to point to next word
bnez $t1, displayLoop # if count != 0 the go to displayLoop
la $a0, crlf # Display "cr/lf"
li $v0, 4 # a0 = address of message
syscall # v0 = 4 which indicates display a string
li $v0, 10 # End Of Program
syscall
.data
array: .word 3, 4, 2, 6, 12, 7, 18, 26, 2, 14, 19, 7, 8, 12, 13
count: .word 15
comma: .asciiz ", "
crlf: .asciiz "\n"
这是我得到的输出:
2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 167780396, 19, 18, 15, 14, 13, 12, 12, 8, 7
我设置外循环 if 语句来检查 t1 是否大于 1,因为当它下降到 1 时,t0 是数组中的最后一个元素,不需要检查其他任何东西
我不确定我的代码中到底发生了什么。当我尝试使用 lw
和 sw
交换数组中的值时出现问题。程序应该是对数组进行升序排序,然后输出。
.text
.globl __start
__start:
la $t0, array # t0 = address of array
lw $t1, count # t1 = count, exit loop when it goes to 0
loop:
lw $t2, ($t0) # t2 = element in array
lw $t4, count # t4 = count, for innerLoop
add $t3, $t0, 4 # t3 = address of next array element
innerLoop:
lw $t5, ($t3) # t5 = element in array
ble $t2, $t5, greater # if element in t2 is >= element in t5 goto greater
sw $t2, ($t3) # store element in t2 into the t3 array address
sw $t5, ($t0) # store element in t5 into the t0 array address
lw $t2, ($t0) # t2 = new element in t0 array address
greater:
add $t4, $t4, -1 # t1 -- -> counter --
add $t3, $t3, 4 # t3 = address of next array element
bnez $t4, innerLoop # if innerLoop count != 0 go to innerLoop
add $t1, $t1, -1 # t1 -- -> counter --
addi $t0, $t0, 4 # t0 = address of next array element
bnez $t1, loop # if loop count != 0 go to loop
la $t0, array # t0 = address of array
lw $t1, count # t1 = count, exit loop when it goes to 0
lw $t2, ($t0) # lw in address t0 into t2
move $a0, $t2 # Display the first element in array
li $v0, 1
syscall
add $t1, $t1, -1 # t1 -- -> counter --
add $t0, $t0, 4 # increment counter to point to next word
displayLoop:
lw $t2, ($t0) # t2 = next element in array
la $a0, comma # Display ", "
li $v0, 4 # a0 = address of message
syscall # v0 = 4 which indicates display a string
move $a0, $t2 # Display element in array
li $v0, 1
syscall
add $t1, $t1, -1 # t1 -- -> counter --
add $t0, $t0, 4 # increment counter to point to next word
bnez $t1, displayLoop # if count != 0 the go to displayLoop
la $a0, crlf # Display "cr/lf"
li $v0, 4 # a0 = address of message
syscall # v0 = 4 which indicates display a string
li $v0, 10 # End Of Program
syscall
.data
array: .word 3, 4, 2, 6, 12, 7, 18, 26, 2, 14, 19, 7, 8, 12, 13
count: .word 15
comma: .asciiz ", "
crlf: .asciiz "\n"
这是我得到的输出:
2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 167780396, 19, 18, 15, 14, 13, 12, 12, 8, 7
我设置外循环 if 语句来检查 t1 是否大于 1,因为当它下降到 1 时,t0 是数组中的最后一个元素,不需要检查其他任何东西