2013-04-17 81 views
7

Vì vậy, tôi đang xây dựng một chương trình máy tính trong MIPS và tôi đang cố gắng viết các hàm nhân và chia.MIPS: Nhân số nguyên và phân chia

Hiện nay tôi đọc trong các số nguyên trong một vòng lặp như vậy:

li $v0, 5 
syscall 

và sau đó cuối cùng gọi chức năng của tôi multidivi tùy thuộc vào hành động của người dùng muốn làm.

Vì vậy, giả sử tôi có các số nguyên trong $a0$a1, những gì sẽ là một cách sạch sẽ để nhân $a0 bởi $a1 và/hoặc chia $a0 bởi $a1? Tôi đã tìm kiếm xung quanh trực tuyến, nhưng tôi không thể tìm thấy một cách sạch sẽ và dễ dàng để làm được điều này, bởi vì tôi phải gửi câu trả lời kết quả trở lại trong $v0

+1

Có điều gì sai với 'hướng dẫn MULT'? – paxdiablo

+0

Tại sao không chỉ chi nhánh cho dù đó là nhân hoặc chia? – rmmh

Trả lời

16

Để nhân, sử dụng mult cho phép nhân có chữ ký và multu cho nhân unsigned . Lưu ý rằng kết quả của phép nhân của hai số 32 bit mang lại 64 số. Nếu bạn muốn kết quả trở lại trong $ v0 có nghĩa là bạn giả định kết quả sẽ phù hợp trong 32 bit.

32 bit quan trọng nhất sẽ được tổ chức tại HI đăng ký đặc biệt (truy cập bằng mfhi hướng dẫn) và 32 bit trọng số thấp nhất sẽ được tổ chức tại LO đăng ký đặc biệt (truy cập bằng mflo hướng dẫn):

Ví dụ:

li $a0, 5 
    li $a1, 3 
    mult $a0, $a1 
    mfhi $a2 # 32 most significant bits of multiplication to $a2 
    mflo $v0 # 32 least significant bits of multiplication to $v0 

Để chia, sử dụng div cho bộ phận có chữ ký và divu cho bộ phận chưa ký. Trong trường hợp này, HI thanh ghi đặc biệt sẽ giữ lời nhắc và LO thanh ghi đặc biệt sẽ giữ thương của bộ phận.

ví dụ .:

div $a0, $a1 
    mfhi $a2 # reminder to $a2 
    mflo $v0 # quotient to $v0 
+0

Sau nhiều lần. Làm thế nào để bạn hợp nhất hai (hi và lo) thành một kết quả? Trong trường hợp tôi biết kết quả sẽ phù hợp trong một đăng ký 32 bit? –

+4

@JohnDemetriou: Nếu bạn đã biết kết quả phù hợp trong 32 bit, bạn chỉ có thể lấy các bit có ý nghĩa thấp bằng cách sử dụng 'mflo' – gusbro

+1

Cảm ơn bạn rất hữu ích –

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