2010-02-28 80 views
6

Cố gắng chuyển đổi mã c này thành MIPS và chạy nó trong SPIM.C để dịch MIPS

int A[100], B[100]; 
for(i=1; i<100; 1++){ 
A[i] = A[i-1] + B[i]; 
} 

Cho đến nay đây là những gì tôi có.

# comments are delimted by has marks 

.data 
A: .word 0:100  # array of 12 integers 
B: .word 0:100  # array of 12 integers 


.text 
main: 
    li $v0, 1  # load the value "1" into register $v0 
    li $t0, 1  # load the value "1" into register $t0 
    li $t1, 100  # load the value "100" into register $t1 
    blt $t0, $t1, loop # branches to Loop if $t0 < 100 
    la $t9, B 
    la $t8, A 

loop: 
    sll $t0, $t0, 2 
    add $t2, $t9, $t0 
    lw $s4, 0($t9) 
    add $t3, $t0, -1 
    add $t4, $t8, $t3 
    lw $s5, 0($t4) 
    add $t5, $t2, $s5 
    add $t6, $s0, $t0 
    sw $t7, 0($t5) 
    addi $t0, $t0, 1 
    li $v0, 1 # system call for print_int 
    move $a0, $t0 # the sum to print 
    syscall # print the sum 

Khi chạy trong SPIM tôi nhận được các lỗi sau đây:

Exception occurred at PC=0x00400040 
    Bad address in data/stack read: 0x00000004 
Exception occurred at PC=0x0040004c 
    Unaligned address in inst/data fetch: 0x00000003 
Exception occurred at PC=0x00400058 
    Bad address in data/stack read: 0x00000000 
Attempt to execute non-instruction at 0x0040006c 

Một số hướng sẽ được tốt đẹp. Cảm ơn

+2

Tại sao không biên dịch trước và tối ưu hóa kết quả? – Potatoswatter

+0

MIPS là gì? Không thể tìm thấy trong wikipdia –

+0

Alon: http://en.wikipedia.org/wiki/MIPS_architecture – Gabe

Trả lời

2

Bạn đang phân nhánh thành loop (blt $t0, $t1, loop) trước khi bạn khởi tạo con trỏ đến AB. Bạn cần di chuyển blt $t0, $t1, loop vào cuối mã của mình, không có mã đó lúc đầu.

Tôi ghét làm điều này, nhưng có quá nhiều điều sai khi liệt kê tất cả. Hãy thử điều này:

.data 
A: .word 0:100  # array of 100 integers 
B: .word 0:100  # array of 100 integers 


.text 
main: 
    li $t0, 4  # load the value "1" into register $t0 
    li $t1, 400  # load the value "100" into register $t1 
    la $t9, B 
    la $t8, A 

loop: 
    add $t2, $t9, $t0 # $t2 = B + i 
    lw $s4, 0($t9)  # $s4 = B[i] 
    add $t3, $t0, -4 # $t3 = i - 1 
    add $t4, $t8, $t3 # $t4 = A + i - 1 
    lw $s5, 0($t4)  # $s5 = A[i - 1] 
    add $t5, $t8, $t0 # $t5 = A + i 
    add $t6, $s4, $s5 # $t6 = B[i] + A[i - 1] 
    sw $t6, 0($t5)  # A[i] = $t6 
    addi $t0, $t0, 4 # i++ 

    li $v0, 1 # system call for print_int 
    move $a0, $t6 # the sum to print 
    syscall # print the sum 

    blt $t0, $t1, loop # branches to Loop if $t0 < 100 
1

Phải tắt bat, s1 và s2 vào địa chỉ ngăn xếp (giả sử) của mảng của bạn.

+0

Tôi đã khởi tạo các mảng đúng cách ngay bây giờ (tôi nghĩ). Im nhận được các lỗi smae, trông giống như với lệnh tải từ đang được thực hiện. – user282964

Các vấn đề liên quan