2017-11-25 4 views
0

MIPS를 사용하여 Dijkstra의 알고리즘을 구현할 때 에지 (소스 인덱스 | 대상 인덱스의 인덱스)를 나타내는 정수 배열을 만들려고합니다.오류 # 5 : 정렬되지 않은 단어 메모리 참조

rsim을 실행할 때 "정렬되지 않은 단어 메모리 참조"오류가 발생합니다. 나는 메모리 정렬이 무엇을 의미하는지 오해하고있을 수도 있다고 생각한다. 내 .DATA 내가 데이터를 배열로 입력 모서리의 수를 반복하고는는 .text에서

.data 
.align 4 

enterNode:   .asciiz "Enter the number of nodes: " 
enterEdges:   .asciiz "Enter the number of edges: " 
enterSource:  .asciiz "Enter source: " 
enterDestination: .asciiz "Enter destination: " 
enterWeight:  .asciiz "Enter weight: " 
newLine:   .asciiz "\n" 
min_nodes:   .word 1 
max_nodes:   .word 20 
error1:    .asciiz "Invalid number of nodes. Must be between 1 and 20.\n" 
error2:    .asciiz "Invalid number of edges. Must be between 0 and 400.\n" 
edgeArr:   .space 4800 
    # source | destination | weight 
input:    .space 5 

이하이지만, 내가 언급하고있는 방법으로 보인다 또는 주소를 계산하는 것은 올바르지 않습니다.

addi $t0, $zero, 0     # Edge counter 
la  $t1, edgeArr 
addi $t2, $zero, 0 

loop: 
    # Source 
    addi $v0, $zero, PRINT_STRING # Print user prompt 
    la  $a0, enterSource 
    syscall 
    addi $v0, $zero, READ_INT  # Take user input 
    syscall 
    add  $t3, $t2, $t2    # Calculate address in array 
    add  $t3, $t3, $t3 
    add  $t3, $t1, $t3 
    sw  $v0, ($t3) 
    addi $t2, $t2, 1 

    # ...destination and weight are effectively identical to source... 

    # Loop condition 
    addi $t0, $t0, 1 
    slt  $t4, $t0, $s1 
    bne  $t4, $zero, loop 

나는 몇 가지 비슷한 질문을 검토 한하지만 그들은 확실히 내가 오해 해요 부분을 해결하지 않는 것, 내가 정말보고 눈의 신선한 쌍의 혜택을 누릴 수 있습니다.

답변

2

.align 4.word 지시문 사이에 문자열이 있습니다.

.align 4 현재 위치를 4의 배수로 만드는 패드 문자열의 전체 크기는 4의 배수가 아니므로 .word 지시어는 단어 정렬 메모리 주소가 아닙니다. min_nodes 상수 빌드 시간이면

.data 
.align 4 
min_nodes:   .word 1 
max_nodes:   .word 20 

edgeArr:   .space 4800 
    # source | destination | weight 
input:    .space 5    # 5 bytes?? 


enterNode:   .asciiz "Enter the number of nodes: " 
enterEdges:   .asciiz "Enter the number of edges: " 
enterSource:  .asciiz "Enter source: " 
enterDestination: .asciiz "Enter destination: " 
enterWeight:  .asciiz "Enter weight: " 
newLine:   .asciiz "\n" 
error1:    .asciiz "Invalid number of nodes. Must be between 1 and 20.\n" 
error2:    .asciiz "Invalid number of edges. Must be between 0 and 400.\n" 

전혀 메모리에 저장하는 대신 .equ로 정의한다. 그렇지 않으면 0으로 설정, $t1=1 경우 $t0 < min_nodes (서명)을 설정하는

.equ min_nodes, 1 
.equ max_nodes, 20 

... 
li $t0, min_modes 

또는 sltiu $t1, $t0, min_modes을 (그래서 당신은 즉시 상수로 사용할 수 있습니다). 큰 부호없는 값으로 바꿈됩니다 1보다

addui $t1, $t0, -1 
then compare against 19 (unsigned) 

값 이하 (19보다 큰 비교) : 그리고 BTW, 당신은 하나 개의 지점과 범위 체크를 할 수 있습니다. 20보다 큰 값은 여전히 ​​또한 읽기 - 쓰기 값으로 문자열 상수를 혼합 할 필요가 없습니다보다 큰 19


될 것입니다. 어셈블러에서 .rodata 또는 .section .rodata을 지원하는 경우 읽기 전용 문자열은 실행 파일의 텍스트 세그먼트에 저장되어 쓰기 방지됩니다.

+0

고마워요, 제가 정확히 찾고 있던 설명입니다. 내가 배열을 선언하는 곳을 생각하지 않았다. 또한 최소 및 최대 노드를 변경해야합니다. 여러분은 단순한 상수이고 아마도 그것들을 선언하는 더 좋은 방법 일 것입니다. 어셈블러가 .rodata를 지원하는지 확신 할 수 없지만 문서를 살펴볼 것입니다. 고맙습니다! – Gladdstone

관련 문제