2013-10-06 1 views
0

mips를 사용하는 클래스 학습 어셈블리의 메신저. 배열 배열을 정렬하는 중입니다. 올바르게 작동하는 메서드가 있다고 생각하지만 문제는 조금 있습니다. 메신저가 완전히 분류 된 때를 확인하는 방법을 모르겠습니다. 나는 정렬에 꽤 기초적인 방법을 사용하고 있지만, 그것은 우리가 지금까지 배웠던 모든 것입니다. 또한, 나는 그것이 정렬되어 있는지 확인하기 위해 숫자를 출력하는 방법을 모르겠습니다. 임씨는 Java에 익숙했기 때문에 어셈블리가 나에게 조금만 던져주고 있습니다. 여기까지 내 코드는 다음과 같습니다.mips의 배열 정렬 (어셈블리)

.text 
    .globl main 
main:  la $a0, Array    # sets the base address of the array to $a0 
loop:  lw $t0, 0($a0)    # sets $t0 to the current element in array 
      lw $t1, 4($a0)   # sets $t1 to the next element in array 
      blt $t1, $t0, swap  # if the following value is greater, swap them 
      addi $a0, $a0, 4  # advance the array to start at the next location from last time 
      j loop     # jump back to loop so we can compare next two elements 

swap:  sw $t0, 4($a0)   # store the greater numbers contents in the higher position in array (swap) 
      sw $t1, 0($a0)   # store the lesser numbers contents in the lower position in array (swap) 
      li $a0, 0     # resets the value of $a0 back to zero so we can start from beginning of array 
      j loop     # jump back to the loop so we can go through and find next swap 

      .data 

Array:  .word 14, 12, 13, 5, 9, 11, 3, 6, 7, 10, 2, 4, 8, 1 

감사합니다!

+0

버블 정렬의 일종처럼 나에게 보인다. 왜 당신은 스와핑 후 배열의 시작 부분으로 이동합니까? arr [i]> arr [i + 1] 인 경우 각 반복 후에 배열의 마지막 위치에 하나 이상의 요소가 있습니다. 이 방법을 사용하면 n 번 (n은 배열의 길이 임)을 n 번 반복하면 끝에 배열을 정렬 할 수 있습니다. –

+0

또한 출력을 사용자에게 작성하는 데 도움이됩니다. http://forum.codecall.net/topic/42881-mips-assembly-take-user-input-and-write-to-the-console/ –

+0

만약 내가 배열의 처음으로 되돌아 가기를 바라지 않고 계속 가려고한다면 배열의 끝에있는 메신저를 어떻게 알 수 있고 어떻게 정렬 될지 어떻게 알 수 있을까요? – erp

답변

2

This linkQTSPIM 또는 MARS과 같은 MIPS 시뮬레이터에서 화면을 인쇄하는 방법을 설명합니다.

코드에는 몇 가지 버그가있었습니다. 제대로 Array의 기본 주소로 재설정됩니다 $a0 있도록 라인 li $a0, 0li가 대신 0으로 배열의 기본 주소를 설정하기 때문에 초기 la $a0, Array 명령에 의해 수행 된 작업을 덮어, 당신은 루프에 la 명령을 이동해야합니다 전체 배열을 반복 한 후 li 명령어를 제거하십시오. 또한 프로그램이 정렬을 완료 할 때 조건을 추가해야합니다. 나는 (SPIM 테스트) 다음과 같은 개정을 건의 할 것입니다 :

main: 
    la $t0, Array  # Copy the base address of your array into $t1 
    add $t0, $t0, 40 # 4 bytes per int * 10 ints = 40 bytes        
outterLoop:    # Used to determine when we are done iterating over the Array 
    add $t1, $0, $0  # $t1 holds a flag to determine when the list is sorted 
    la $a0, Array  # Set $a0 to the base address of the Array 
innerLoop:     # The inner loop will iterate over the Array checking if a swap is needed 
    lw $t2, 0($a0)   # sets $t0 to the current element in array 
    lw $t3, 4($a0)   # sets $t1 to the next element in array 
    slt $t5, $t2, $t3  # $t5 = 1 if $t0 < $t1 
    beq $t5, $0, continue # if $t5 = 1, then swap them 
    add $t1, $0, 1   # if we need to swap, we need to check the list again 
    sw $t2, 4($a0)   # store the greater numbers contents in the higher position in array (swap) 
    sw $t3, 0($a0)   # store the lesser numbers contents in the lower position in array (swap) 
continue: 
    addi $a0, $a0, 4   # advance the array to start at the next location from last time 
    bne $a0, $t0, innerLoop # If $a0 != the end of Array, jump back to innerLoop 
    bne $t1, $0, outterLoop # $t1 = 1, another pass is needed, jump back to outterLoop 

각 MIPS 명령어가하는 일에 대한 자세한 예제와 설명은 this link을 확인하시기 바랍니다.

0

.DATA

값 : .word은 0x3

어레이 : .word하는 0x14, 0x12로, 0x13, 명령이 0x05

는 .text

.globl 메인

주 : 라 $ a0, 배열

lw $t3,value 

L1 : LW $ t0의, 0 ($의 A0)

lw $t1, 4($a0)  

    blt $t1, $t0, swap 

    addi $a0, $a0, 4 

    addi $t3,$t3,-1  

    bne $t3,$zero,l1 

    jr $ra 

스왑 : SW $ t0의 4 년 ($ A0)는

sw $t1, 0($a0)  

    j l1