Vì vậy, chúng tôi đang nghiên cứu kiến trúc MIPS ở trường và chúng tôi đang triển khai kiến trúc MIPS32. Tôi nghĩ rằng tôi muốn sử dụng GNU cross-binutils như assembler nhưng tôi nhận được sản lượng lạ khi giao dịch với các hướng dẫn jal, j và jr. Người lắp ráp dường như chèn các chỉ dẫn ở những nơi sai. Tôi không biết tại sao điều này lại xảy ra, và tôi nghi ngờ rằng người lắp ráp MIPS sẽ bị hỏng, vì vậy tôi cho rằng điều này được cho là xảy ra.Hành vi lắp ráp MIPS lạ với lệnh nhảy (và liên kết)
Đây là tập tin lắp ráp hình nộm của tôi:
.section .text
.globl __start
__start:
addi $a0, $0, 100
addi $a1, $0, 200
jal test
test:
add $v0, $a0, $a1
jr $ra
Tuy nhiên, khi tôi tháo rời tôi nhận được kết quả này:
Disassembly of section .text:
00000000 <__start>:
0: 20040064 addi a0,zero,100
4: 0c000003 jal c <test> <--- Why is jal coming before addi?
8: 200500c8 addi a1,zero,200
0000000c <test>:
c: 03e00008 jr ra <--- Why is jr coming before add?
10: 00851020 add v0,a0,a1
...
Đây có phải là một số những đứa kiến trúc? Nếu vậy, lý do đằng sau điều này là gì?
EDIT: Tested thêm một số của nop chỉ dành riêng cho các heck ...
.section .text
.globl __start
__start:
addi $a0, $0, 100
addi $a1, $0, 200
nop
jal test
test:
add $v0, $a0, $a1
nop
jr $ra
và nó mang lại cho tôi một cái gì đó có vẻ hơi đúng.
Disassembly of section .text:
00000000 <__start>:
0: 20040064 addi a0,zero,100
4: 200500c8 addi a1,zero,200
8: 0c000004 jal 10 <test>
c: 00000000 nop
00000010 <test>:
10: 00851020 add v0,a0,a1
14: 03e00008 jr ra
18: 00000000 nop
1c: 00000000 nop
Tại sao jal và j đổi địa điểm với hướng dẫn cuối cùng?
Trông giống như một vấn đề cuối cùng bên trong trình biên dịch (hoặc trình tháo rời), chỉ trên lớp lệnh thay vì lớp byte ... lạ ... – schnaader