주소를 인쇄 할 때 몇 시간을 보냈지 만 알아낼 수 없습니다. 이것은 QTSpim을 통해 실행되는 간단한 어셈블리 프로그램입니다. 프로그램은 크기가 20 인 배열에 대해 값을 취하고 배열에서 두 개의 가장 작은 정수를 찾은 다음 배열을 추가 한 다음 main에 반환하여 배열 바로 다음 위치의 메모리에 저장합니다.MIPS 데이터/스택 읽기의 주소가 잘못되었습니다.
프로그램은 배열에 대해 20 개의 값을 취하지 만, 데이터/스택 읽기의 잘못된 주소 인 0x10040000을 계산하여 뱉어냅니다. 내 모든 다른 데이터는 0x100100XX 메모리 위치에 있으며, 왜 40000이오고 있는지 알 수 없습니다.
.data
Fresh: .space 80
freshSmallestSum: space 4
.text
sumMin:
lw $t2, 0($a0) # $t2 = smallest array[i]
addi $t4, $t0, 1 # $t4 = i + 1
sll $t4, $t4, 2 # $t4 = i * (2^2)
add $t4, $t4, $a0 # $t4 = absolute address array[i+1]
lw $t3, 0($t4) # $t3 = array[i+1]
li $t4, 2 # i = 2
ble $t2, $t3, loopSmall # if $t2 <= t3 jump
move $t9, $t2
move $t2, $t3
move $t3, $t9
loopSmall:
bge $t4, $t1, ret1
sll $t5, $t4, 2 # $t5 = i * (2^2)
add $t5, $t5, $a0 # absolute address array[i]
lw $t5, 0($t5) # $t5 = array[i]
ble $t3, $t5, next2 # if $t3 <= array[i], jump
move $t3, $t5 # else $t3 = array[i]
ble $t2, $t3, next2 # if $t2 <= $t3, jump
move $t9, $t2 # else swap two smallest
move $t2, $t3
move $t3, $t9
next2:
addi $t4, $t4, 1 # i++
j loopSmall
ret1:
add $v0, $t2, $t3 # $v0 = smallest + secondSmallest
jr $ra
.text
.globl main
main:
li $t3, 0
li $t0, 0 # i = 0
li $t1, 20 # $t1 = 20
la $s2, Fresh
inLoop:
bge $t3, $t1, next # If $t3 > array length, jump
sll $t2, $t3, 2
add $t4, $t2, $s2 # Absolute address of fresh
li $v0, 5
syscall
sw $v0, 0($t4)
addi $t3, $t3, 1 # Increment counter
j inLoop
move $a0, $s2 # $a0 = address Fresh
jal sumMax # Get max sum of Fresh
la $t1, freshLargestSum
sw $v0, 0($t1) # Store sum in freshLargestSum
move $a0, $s2
jal sumMin # Get min sum of Fresh
la $t1, freshSmallestSum
sw $v0, 0($t1) # Store sum in freshSmallestSum
exit: li $v0, 10
syscall
시뮬레이터를 사용하여 코드를 단계별로 실행하고 오류가있는 명령을 확인하십시오. 그런 다음 레지스터 값을 확인하고 잘못된 점을 확인한 다음 역으로 작업하여 나쁜 값을 얻었는지 확인합니다. 추신 : 나는 '다음'이라는 라벨을 찾을 수 없으며, 복사 - 붙여 넣기 오류가 있거나 정말로 갖고 있지 않습니까? 또한,'sumMin'은'$ t1'에서 배열 크기를 예상하는 것 같지만 그 시점에서'freshLargestSum'의 주소를 포함합니다. – Jester
죄송합니다 - 분명히 복사 붙여 넣기 오류가 발생했습니다 - 프로그램이이 코드 세그먼트보다 훨씬 오래되었습니다. 관련 조각 만 자르려고합니다. 그리고 $ t1은 오류였습니다! 정말 고마워요. 작은 레지스터 변경이 sumMin 코드의 코드에서 가까와서 나는 그것을 잡지 못했습니다. 귀하의 의견에 의해 고정 된 미래의 응시 시간, 감사합니다! – Tenze
특히 초보자 인 경우 디버그 도움말을 위해 실제로 게시하는 코드를 테스트해야합니다. –