Tôi đang nghiên cứu ngôn ngữ lắp ráp MIPS và đã xem qua ví dụ này trong sách và với tôi dường như không chính xác. Nếu đó không phải là sai lầm đầu tiên tôi tìm thấy trong cuốn sách này.Chuyển đổi C thành MIPS - Mảng lồng nhau
Các biến f
và g
đăng ký được giao $s0
và $s1
tương ứng, địa chỉ cơ sở cho các mảng A
và B
là $s6
và $s7
tương ứng.
Ví dụ mã c là:
f = g - A[B[4]];
Và lắp ráp MIPS tương ứng được cung cấp là:
lw $t0, 16($s7)
lw $s0, 0($t0)
sub $s0, $s1, $s0
Từ tôi tìm hiểu trên mã MIPS sẽ tải một số dữ liệu ngẫu nhiên từ bộ nhớ tại địa chỉ cung cấp bởi $t0
và sau đó trừ nó khỏi $s1
và không truy cập vào chỉ mục $t0
của mảng được biểu thị trong $s6
.
Các MIPS lắp ráp chính xác từ hiểu biết của tôi sẽ là dọc theo dòng:
lw $t0, 4($s7)
add $t0, $t0, $s6
sll $t0, $t0, 2
lw $s0, 0($t0)
sub $s0, $s1, $s0
tôi đúng rằng đây là một lỗi trong cuốn sách hay tôi hiểu lầm gì đó.
Edit: Cố định một lỗi trong mã mips sửa chữa như đã chỉ ra bởi Chris Dodd
Tôi nghĩ bạn đã đúng. Làm tốt! – davin
Giải thích của bạn thật tuyệt vời. Bằng chứng lớn nhất của thực tế là mã đó không làm những gì nó được cho là, là không có đề cập đến bất cứ điều gì của '$ s6', do đó, không có cách nào nó có thể lấy một phần tử từ mảng' A'. – davin
Giả sử mảng A là 4 byte cho mỗi phần tử (vì mảng B có vẻ là - bạn đang sử dụng bù đắp 16 để lấy phần tử 4 và sử dụng lệnh lw để nhận 4 byte), bạn sẽ cần thêm nhân với 4 ở đây quá (hoặc một ca tương đương bằng 2) –