Dưới đây là một số mã lắp ráp MIPS tôi đã viết để kiểm tra hướng dẫn nhảy:Jump hướng dẫn trong MIPS hội
addi $a0, $0, 1
j next
next:
j skip1
add $a0, $a0, $a0
skip1:
j skip2:
add $a0, $a0, $a0
add $a0, $a0, $a0
skip2:
j skip3
loop:
add $a0, $a0, $a0
add $a0, $a0, $a0
add $a0, $a0, $a0
skip3:
j loop
Khi tôi chạy lắp ráp, đây là kết quả:
[0x000000] 0x20040001 # addi $a0, $zero, 1 ($a0 = 1)
[0x000004] 0x08000002 # j 0x0002 (jump to addr 0x0008)
[0x000008] 0x08000004 # j 0x0004 (jump to addr 0x0010)
[0x00000C] 0x00842020 # add $a0, $a0, $a0 ($a0 = $a0 + $a0)
[0x000010] 0x08000007 # j 0x0007 (jump to addr 0x001C)
[0x000014] 0x00842020 # add $a0, $a0, $a0 ($a0 = $a0 + $a0)
[0x000018] 0x00842020 # add $a0, $a0, $a0 ($a0 = $a0 + $a0)
[0x00001C] 0x0800000B # j 0x000B (jump to addr 0x002C)
[0x000020] 0x00842020 # add $a0, $a0, $a0 ($a0 = $a0 + $a0)
[0x000024] 0x00842020 # add $a0, $a0, $a0 ($a0 = $a0 + $a0)
[0x000028] 0x00842020 # add $a0, $a0, $a0 ($a0 = $a0 + $a0)
[0x00002C] 0x08000008 # j 0x0008 (jump to addr 0x0020)
Nhìn vào máy mã cho hướng dẫn nhảy, đây là những gì tôi thấy:
1st jump (just jumps to next instruction) 0x08000002
2nd jump (skips 1 instruction) 0x08000004
3rd jump (skips 2 instructions) 0x08000007
4th jump (skips 3 instructions) 0x0800000B
5th jump (skips 3 instructions backwards) 0x08000008
Từ khi xem các hướng dẫn này, có vẻ như ike mã máy bắt đầu với số 08 cho lệnh nhảy và số ở cuối cho biết lệnh nhảy ở đâu. Tuy nhiên, tôi không thể tìm ra cách tính số này. Ngoài ra, không có gì để chỉ cho tôi rằng bước nhảy thứ 5 là một bước nhảy lùi.
Giá trị nhảy được tính như thế nào?
tại sao bạn sử dụng 3 'thêm $ a0, $ a0, $ a0'? tại sao không sử dụng 'sll $ a0, $ a0, 3' –