2016-06-17 3 views
0

프로그램은 다음 기능을 고려해야합니다. 해결할 시스템이있는 2D 배열이 기존 변수 메모리로 프로그램에 전달됩니다. - 데이터 유형이 double float입니다. - 결과를 다른 변수에 저장해야합니다. - 프로그램은 해결되기 전에 선형 방정식 시스템을 보여 주어야하며 마지막에는 솔루션을 보여 주어야합니다. 나는 가우스 방법을 적용하는 방법을 모른다가우스 제거 방법 어셈블리 MIPS

.text 

ldc1 $f30, double.zero($0) 
ldc1 $f28, double.um($0) 
ldc1 $f26, ajuste.ID($0) 

la $a0,comeco 
li $v0,4 
syscall 

la $a1,matrizA 
jal build 

la $a1, matrizAinv 
lw $a2, importante($0) 
jal buildID 

la $a0,imprimirA 
li $v0,4 
syscall 

la $a1,matrizA 
jal printmatrix 

la $a0,matrizA 
lw $a1,importante($0) 
la $a2,matrizA2 
jal copia_matriz 

la $a0,imprimirID 
li $v0,4 
syscall 

la $a1,matrizAinv 
lw $a2,importante($0) 
jal printmatrix 

li $v0,10 #Fim 
syscall 

build: 
la $a0, dimensao 
li $v0, 4 
syscall 

li $v0, 5 
syscall 

sw $v0, importante($0) 
move $t0, $v0 

move $t2, $zero 
move $t3, $zero 
li $t5, 8 

main.cycle: 
beq $t3, $t0, continue 

second.cycle: 
beq $t2, $t0, third.cycle 
la $a0, element 
li $v0, 4 
syscall 

move $a0, $t3 
li $v0, 1 
syscall 

la $a0, comma 
li $v0, 4 
syscall 

move $a0, $t2 
li $v0, 1 
syscall 

li $v0, 7 
syscall 

sdc1 $f0, 0($a1) 

add $a1, $a1, $t5 

la $a0, enter 
li $v0, 4 
syscall 

addi $t2, $t2, 1 #faz j++ 

j second.cycle 

third.cycle: 
addi $t3, $t3, 1 
move $t2, $zero 

j main.cycle 

continue: 
jr $ra 

buildID: 
move $t2,$zero #i=0 
move $t3,$zero #j=0 

first.loop: 
beq $t2,$a2,continue 

second.loop: 
beq $t3,$a2,controle.conts 
bne $t2,$t3,element.zero 
sdc1 $f28,0($a1) 

end.second.loop: 
add $a1,$a1,$t5 
addi $t3,$t3,1 
j second.loop 

element.zero: 
sdc1 $f30,0($a1) 

j end.second.loop 

controle.conts: 
addi $t2,$t2,1 
move $t3,$zero 

j first.loop 

copia_matriz: 
move $t0,$0 
move $t1,$0 

loop: 

beq $t0,$a1,fim_copia_matriz 
beq $t1,$a1,incrementa.zera 

ldc1 $f1,0($a0) 
sdc1 $f1,0($a2) 

addi $a0,$a0,8 
addi $a2,$a2,8 
addi $t1,$t1,1 

j loop 

incrementa.zera: 
addi $t0,$t0,1 
move $t1,$0 

j loop 

fim_copia_matriz: 
jr $ra 

printmatrix: 
move $t0,$a2 
move $t1,$a2 

move $t2, $zero #reset i 
move $t3, $zero #reset j 

main.cycle3: #main cycle that print the matrix (first for) 

beq $t2, $a2, exit3 #if i equal the number of lines of the matrix jump to exit3 

la $a0, bar #load the addr of barleft into $a0 
li $v0, 4 #4 is the print_string syscall 
syscall #do the syscall 

second.cycle3: #second cycle that print the matrix (second for) 

la $a0, tab #load the addr of tab into $a0 
li $v0, 4 #4 is the print_string syscall 
syscall 

beq $t3, $t0, third.cycle3 #if j equal the number of columms of the matrix go to the third cycle 

mul $t4, $t0, $t2 #ColC*i 
add $t4, $t4, $t3 #ColC*i+j 
sll $t4, $t4, 3 #(ColC*i+j)*8 

add $t5, $a1, $t4 #go to the element C[i][j] 

ldc1 $f12, 0($t5) 

li $v0, 3 #3 is the print_double syscall 
syscall #do the syscall 

move $t4, $zero #reset the index of the element 
move $t5, $zero #reset the adress of the element 

addi $t3, $t3, 1 #do j++ 

j second.cycle3 #continue the while with j++ 

third.cycle3: #third cycle that builds the matrix 

addi $t2, $t2, 1 #do i++ 

la $a0, bar #load the addr of barright into $a0 
li $v0, 4 #4 is the print_string syscall 
syscall #do the syscall 

la $a0, enter #load the addr of enter into $a0 
li $v0, 4 #4 is the print_string syscall 
syscall #do the syscall 

move $t3, $zero #reset j 

j main.cycle3 #continue the while with i++ 

exit3: #after print the matrix, return to main 

la $a0, enter #load the addr of enter into $a0 
li $v0, 4 #4 is the print_string syscall 
syscall #do the syscall 

jr $ra #return to main 

:

나는 행렬을 보여줍니다이 코드를했다. 너희들이 날 도와 줄 수있어?

+0

화면에 매트릭스 표시 ... 우리는 C 코드를 가지고 있지만 어셈블리에서는 구현할 수 없습니다. – AndreLopes

+1

알고리즘 작동 방식을 알고 있으며 C? C 코드처럼 작동하는 asm을 작성하십시오. 가우시안 제거에 특별한 것은 없지만 C와는 다른 기능을 수행합니다 (예 : FP 추가/하위/다중/div 및 메모리로드/저장). –

+1

Peter가 말했듯이 C 코드를 먼저 작성하십시오. 상위 댓글 블록에 포함하십시오. asm 사이드 바 주석은이 변수에 사용 된 변수를 참조 할 수 있습니다. 내 말은, 내 대답을 참조하십시오. http://stackoverflow.com/questions/36538325/mips-linked-list/36560575#36560575 –

답변

0

도움이되는지 확인하십시오. 건배

### Text segment 
    .text 

main: 
    la $a0, matrix_3x3 
    li $a1, 3 
    jal  print_matrix 
    nop 
    jal  gauss_reduct 
    nop 
    jal  print_matrix 
    nop 
    la $a2, solution 
    jal  gauss_solve 
    nop 
    jal  print_solution 
    nop 

exit: 
    li $v0, 10 
    syscall 


gauss_reduct: 
    addiu $sp, $sp, -24 
    sw $ra, 20($sp) 
    sw  $s2, 16($sp) 
    sw $s1, 12($sp) 
    sw $s0, 8($sp) 
    sw $a1, 4($sp) 
    sw $a0, 0($sp) 

    add $t3, $a0, $zero 
    addi $t4, $a1, -1 
    addi $t5, $a1, 0 

    add $t2, $zero, $zero 
gauss_reduct_ciclok: 
    beq $t2, $t5, gauss_reduct_end 
    nop 

    add $t1, $zero, $zero 
gauss_reduct_cicloj: 
    beq $t1, $t5, gauss_reduct_fim_ciclo_j 
    nop 

    beq $t1,$t2,gauss_reduct_cicloj_continue 
    nop 

    move $a0, $t1 
    move $a1, $t2 
    jal fetchaddress 
    nop 
    move $s1, $v0 

    ldc1 $f6,($s1) 

    move $a0, $t2 
    move $a1, $t2 
    jal fetchaddress 
    nop 
    move $s1, $v0 

    ldc1 $f8,($s1) 

    div.d $f4,$f6,$f8 

    add $t0,$zero,$zero 

    move $a0, $t1 
    move $a1, $t0 
    jal fetchaddress 
    nop 
    move $s1, $v0 

    move $a0, $t2 
    move $a1, $t0 
    jal fetchaddress 
    nop 
    move $s2, $v0 

gauss_reduct_cicloi: 
    bgt $t0, $t5,gauss_reduct_fim_ciclo_i 
    nop 

    ldc1 $f6,($s1) 
    ldc1 $f8,($s2) 

    mul.d $f8,$f8,$f4 
    sub.d $f6,$f6,$f8 
    sdc1 $f6,($s1) 
    addiu $t0,$t0,1 

    addiu $s1,$s1,8 
    addiu $s2,$s2,8 

    j gauss_reduct_cicloi 
    nop 

gauss_reduct_fim_ciclo_i: 

gauss_reduct_cicloj_continue: 
    addiu $t1,$t1,1 
    j gauss_reduct_cicloj 
    nop 

gauss_reduct_fim_ciclo_j: 
    addiu $t2,$t2,1 
    j gauss_reduct_ciclok 
    nop 

gauss_reduct_end: 
    lw $ra, 20($sp) 
    lw $s2, 16($sp) 
    lw $s1, 12($sp) 
    lw $s0, 8($sp) 
    lw $a1, 4($sp) 
    lw $a0, 0($sp) 
    addiu $sp, $sp, 24 

    jr $ra 
    nop 

gauss_solve: 
    addiu $sp, $sp, -24 
    sw $ra, 20($sp) 
    sw  $s2, 16($sp) 
    sw $s1, 12($sp) 
    sw $s0, 8($sp) 
    sw $a1, 4($sp) 
    sw $a0, 0($sp) 

    add $t3, $a0, $zero 
    addi $t0, $a1, -1 
    addi $t5, $a1, 0 

    sll $s1, $t4, 3 
    addu $s1, $s1, $a2 

    addi $t0, $t4, 0 
gauss_solve_cicloi: 
    blt $t0, $zero, gauss_solve_end 
    nop 

    # v0 = &A[i][n] 
    move $a0, $t0 
    move $a1, $t5 
    jal fetchaddress 
    nop 

    # $f6 = A[i][n] 
    ldc1 $f6,($v0) 

    # X[i] = A[i][n] 
    sdc1 $f6,($s1) 

    addi $t1, $t0, 1 

    sll $s2, $t1, 3 
    add $s2, $s2, $a2 

gauss_solve_cicloj: 
    beq $t1, $t5, gauss_solve_fim_cicloi 
    nop 

    # v0 = &A[i][j] 
    move $a0, $t0 
    move $a1, $t1 
    jal fetchaddress 
    nop 

    ldc1 $f8,($v0) 
    ldc1 $f4,($s2) 
    mul.d $f8,$f8,$f4 

    sub.d $f6,$f6,$f8 
    sdc1 $f6,($s1) 

    addi $t1,$t1,1 
    addi $s2, $s2, 8 
    j gauss_solve_cicloj 
    nop 

gauss_solve_fim_cicloi: 

    # v0 = &A[i][i] 
    move $a0, $t0 
    move $a1, $t0 
    jal fetchaddress 
    nop 

    # $f8 = A[i][i] 
    ldc1 $f8,($v0) 

    # x[i] = x[i]/A[i][i]; 
    div.d $f6,$f6,$f8 
    sdc1 $f6,($s1) 

    subi $t0,$t0,1 
    subi $s1, $s1, 8 
    j gauss_solve_cicloi 
    nop 

gauss_solve_end: 
    lw $ra, 20($sp) 
    lw $s2, 16($sp) 
    lw $s1, 12($sp) 
    lw $s0, 8($sp) 
    lw $a1, 4($sp) 
    lw $a0, 0($sp) 
    addiu $sp, $sp, 24 

    jr $ra 
    nop 

fetchaddress: 
    addiu $t5,$t5,1 
    multu $a0, $t5 
    subiu $t5,$t5,1 
    mflo $v0 
    add $v0, $v0, $a1 
    sll $v0, $v0, 3 
    add $v0, $v0, $t3 
    jr $ra 
    nop 


print_matrix: 
    addiu $sp, $sp, -24 
    sw $ra, 20($sp) 
    sw $s2, 16($sp) 
    sw $s1, 12($sp) 
    sw $s0, 8($sp) 
    sw $a2, 4($sp) 
    sw $a0, 0($sp) 

    move $s2, $a0 
    move $s1, $zero 
loop_s1: 
    addi $a2,$a1,1 
    move $s0, $zero 
loop_s0: 
    l.d $f12, 0($s2) 
    li $v0, 3 
    syscall 
    la $a0, spaces 
    li $v0, 4 
    syscall 

    addiu $s2, $s2, 8 

    addiu $s0, $s0, 1 
    blt $s0, $a2, loop_s0 
    nop 
    la $a0, newline 
    syscall 
    addiu $s1, $s1, 1 
    blt $s1, $a1, loop_s1 
    nop 
    la $a0, newline 
    syscall 

    lw $ra, 20($sp) 
    lw $s2, 16($sp) 
    lw $s1, 12($sp) 
    lw $s0, 8($sp) 
    lw $a2, 4($sp) 
    lw $a0, 0($sp) 
    addiu $sp, $sp, 20 

    jr $ra    # return 
    nop 


print_solution: 
    addiu $sp, $sp, -24 
    sw $ra, 20($sp) 
    sw  $s2, 16($sp) 
    sw $s1, 12($sp) 
    sw $s0, 8($sp) 
    sw $a2, 4($sp) 
    sw $a0, 0($sp) 

    move $s1, $zero 
    move $s2, $a2 

print_solution_loop_s0: 
    ldc1 $f12, ($s2) 
    li $v0, 3 
    syscall 

    addiu $s2, $s2, 8 
    addiu $s1, $s1, 1 
    la $a0, newline 
    li $v0, 4 
    syscall 
    blt $s1, $a1, print_solution_loop_s0 
    nop 

    lw $ra, 20($sp) 
    lw $s2, 16($sp) 
    lw $s1, 12($sp) 
    lw $s0, 8($sp) 
    lw $a2, 4($sp) 
    lw $a0, 0($sp) 
    addiu $sp, $sp, 20 

    jr $ra 
    nop 

### End of text segment 

### Data segment 
    .data 

### String constants 
spaces: 
    .asciiz " " 
newline: 
    .asciiz "\n" 

## Input matrix: (4x4) ## 
matrix_4x4: 
    .double 1.0 
    .double -2.0 
    .double 1.0 
    .double 3.0 

    .double 1.0 

    .double 2.0 
    .double -2.0 
    .double -2.0 
    .double -2.0 

    .double 5.0 

    .double 1.0 
    .double -0.25 
    .double 4.0 
    .double 7.0 

    .double -7.0 

    .double 1.0 
    .double 1.0 
    .double 1.0 
    .double 1.0 

    .double 3.0 

solution: 
    .double 0.0 
    .double 0.0 
    .double 0.0 
    .double 0.0 

matrix_3x3: 
    .double 2.0 
    .double 1.0 
    .double -3.0 

    .double -1.0 

    .double -1.0 
    .double 3.0 
    .double 2.0 

    .double 12.0 

    .double 3.0 
    .double 1.0 
    .double -3.0 

    .double 0.0 

### End of data segment 
+0

답에 몇 가지 설명을 추가 할 수 있습니까? 문제가 어디에 있느냐? 너는 어떻게 생각하니? – mnwsmit