Vấn đề về in kết quả khi code MIPS

mong mn có thể giải đáp thắc mắc hộ mình với
mk code MISP số thập phân bằng fraction
mình đã sửa mã nguồn liên tục nhưng kết quả vẫn là 0.0 cho cả 2 là mul và div
dưới đây là đoạn code của e kèm giải thích cho mn dễ hiểu

.data
    A: .word 0       # Số thực A
    B: .word 0       # Số thực B

    ResultMul: .word 0  # Kết quả nhân
    ResultDiv: .word 0  # Kết quả chia

.text
    main:
        # Nhập số thực A
        li $v0, 6           # Sử dụng mã hệ thống 6 để nhập số thực
        syscall
        sw $v0, A           # Lưu giá trị số thực vào A

        # Nhập số thực B
        li $v0, 6           # Sử dụng mã hệ thống 6 để nhập số thực
        syscall
        sw $v0, B           # Lưu giá trị số thực vào B

        # Gọi hàm nhân
        jal mulDouble
        # Kết quả được lưu trong ResultMul

        # Gọi hàm chia
        jal divDouble
        # Kết quả được lưu trong ResultDiv

        # Hiển thị kết quả
        # In giá trị của ResultMul
        li $v0, 2
        lw $a0, ResultMul
        syscall

        # Xuống dòng
        li $v0, 4
        la $a0, newline
        syscall

        # In giá trị của ResultDiv
        li $v0, 2
        lw $a0, ResultDiv
        syscall

        # Kết thúc chương trình
        li $v0, 10
        syscall

mulDouble:
        # Thủ tục nhân hai số thực
        lw $t0, A
        lw $t1, B

        # Nhân A và B
        mul $t2, $t0, $t1

        # Lưu kết quả vào ResultMul
        sw $t2, ResultMul

        # Trả kết quả
        jr $ra

divDouble:
        # Thủ tục chia hai số thực
        lw $t0, A
        lw $t1, B

        # Chia A cho B
        div $t2, $t0, $t1

        # Lưu kết quả vào ResultDiv
        sw $t2, ResultDiv

        # Trả kết quả
        jr $ra

.data
    newline: .asciiz "\n"   # Chuỗi xuống dòng

Dựa vào mã nguồn bạn cung cấp, có thể nhận thấy rằng bạn đang viết mã trong ngôn ngữ Assembly trên môi trường MIPS. Có một số điểm cần kiểm tra:

  1. Bạn cần đảm bảo rằng giá trị bạn nhập vào cho số thực A và B đã đúng.
  2. Kiểm tra xem hàm nhân (mulDouble) và hàm chia (divDouble) được gọi đúng cách.
  3. Đảm bảo bạn đã sử dụng các thanh ghi và các hàm lưu trữ được đúng để thực hiện phép nhân và chia.
mulDouble:
    lw $f4, A           # Load giá trị số thực A vào thanh ghi f4
    lw $f6, B           # Load giá trị số thực B vào thanh ghi f6
    
    mul.d $f8, $f4, $f6  # Nhân A và B, kết quả lưu vào thanh ghi f8

    sdc1 $f8, ResultMul  # Lưu kết quả từ thanh ghi f8 vào ResultMul
    
    jr $ra

divDouble:
    lw $f4, A           # Load giá trị số thực A vào thanh ghi f4
    lw $f6, B           # Load giá trị số thực B vào thanh ghi f6

    div.d $f8, $f4, $f6  # Chia A cho B, kết quả lưu vào thanh ghi f8

    sdc1 $f8, ResultDiv  # Lưu kết quả từ thanh ghi f8 vào ResultDiv

    jr $ra

Lâu tớ không dùng MIPS rồi, cơ mà hình như cậu đang coi 2 số A và B như 2 số nguyên hơn là 2 số thực.
Nếu tớ không nhầm:

  • Ở .data section, cậu cần khai báo .float chứ không phải .word
  • Cậu cũng không thể dùng lw cho số thực. lwc1 hình như mới là cách đúng.
  • mul không dùng cho số thực, mà là mul.s hoặc mul.d, tuỳ thuộc và độ chính xác cậu cần.

Hope it helps!

1 Like
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?