如何将地址分配给标签? winmips64
一切都很好,直到我到达LW R9,0(R7),因为我没有标签的地址。我该如何制作,以便可以存储标签的地址并跳到标签上?
IM应该使其在WinMIPS64
//C code
switch (k){
case 0: f = i + j; break ; /* k = 0*/
case 1: f = g + h; break ; /* k = 1*/
case 2: f = g - h; break ; /* k = 2*/
case 3: f = i - j; break ; /* k = 3*/
}
“理论” MIPS代码(不是实际的MIP)
slt $t3, $s5, $zero # $t3=1 if k < 0
bne $t3, $zero , Exit # if k < 0 go to Done
slt $t3, $s5, $t2 # Test if k < 4
beq $t3, $zero , Exit # if k >= 4 go to Done
add $t1, $s5, $s5
add $t1, $t1, $t1
#Assume Four sequential words in memory with the address in $t4 contain the
#addresses corresponding to the Labels L0,L1....
add $t1, $t1, $t4 # $t1=address of JumpTable[k]
lw $t0, 0($t1) # $t1=JumpTable[k]
jr $t0
L0: add $s0, $s3, $s4 # f = i + j
j Done
L1: add $s0, $s1, $s2 # f = g + h
j Done
L2: sub $s0, $s3, $s4 # f = g - h
j Done
L3: sub $s0, $s1, $s2 # f = i - j
Done:
中起作用,因为我使用的是WinMIPS64,
;r0 = $zero
;r1 = f s0
;r2 = h s2
;r3 = i s3
;r4 = j s4
;r5 = k s5
;r10 = g s1
;r6 = Temp1
;r7 = Temp2
;r8 = Temp3
;r9 = Temp4
.data
f: .word 0,0
h: .word 0x00000010
i: .word 0x00000000
j: .word 0x00000000
k: .word 0x00000010
Temp1: .word 0x00000000
Temp2: .word 0x00000000
Temp3: .word 0x00000000
Temp4: .word 0x00101000
g: .word 0x00001000
.text
start: jal SwitchCases ; call subroutine
nop
halt
SwitchCases:
lw r1, f(r0)
lw r2, h(r0)
lw r3, i(r0)
lw r4, j(r0)
lw r5, k(r0)
lw r6, Temp1(r0)
lw r7, Temp2(r0)
lw r8, Temp3(r0)
lw r9, Temp4(r0)
lw r10, g(r0)
slt r6, r5, r0
bne r6, r0, Exit
slt r6, r5, r7
beq r6, r0, Exit
dadd r7, r5, r5
dadd r7, r7, r7
dadd r7, r7, r8
lw r9, 0(r7)
jr r9
L0: dadd r1, r3, r4
j Exit
L1: dadd r1, r10, r2
j Exit
L2: dsub r1, r3, r4
j Exit
L3: dsub r1, r10, r2
j Exit
Exit:
因为先前的代码$ t1必须存储Jumptable [k]的地址。
Everything runs well until I reach lw r9, 0(r7) because I dont have the address of the labels. How do I make it so I can store the address of the labels and jump to the label?
Im supposed to make it work in WinMIPS64
//C code
switch (k){
case 0: f = i + j; break ; /* k = 0*/
case 1: f = g + h; break ; /* k = 1*/
case 2: f = g - h; break ; /* k = 2*/
case 3: f = i - j; break ; /* k = 3*/
}
"Theoretical" MIPS Code(not actual MIPS)
slt $t3, $s5, $zero # $t3=1 if k < 0
bne $t3, $zero , Exit # if k < 0 go to Done
slt $t3, $s5, $t2 # Test if k < 4
beq $t3, $zero , Exit # if k >= 4 go to Done
add $t1, $s5, $s5
add $t1, $t1, $t1
#Assume Four sequential words in memory with the address in $t4 contain the
#addresses corresponding to the Labels L0,L1....
add $t1, $t1, $t4 # $t1=address of JumpTable[k]
lw $t0, 0($t1) # $t1=JumpTable[k]
jr $t0
L0: add $s0, $s3, $s4 # f = i + j
j Done
L1: add $s0, $s1, $s2 # f = g + h
j Done
L2: sub $s0, $s3, $s4 # f = g - h
j Done
L3: sub $s0, $s1, $s2 # f = i - j
Done:
What I have Using WinMips64
;r0 = $zero
;r1 = f s0
;r2 = h s2
;r3 = i s3
;r4 = j s4
;r5 = k s5
;r10 = g s1
;r6 = Temp1
;r7 = Temp2
;r8 = Temp3
;r9 = Temp4
.data
f: .word 0,0
h: .word 0x00000010
i: .word 0x00000000
j: .word 0x00000000
k: .word 0x00000010
Temp1: .word 0x00000000
Temp2: .word 0x00000000
Temp3: .word 0x00000000
Temp4: .word 0x00101000
g: .word 0x00001000
.text
start: jal SwitchCases ; call subroutine
nop
halt
SwitchCases:
lw r1, f(r0)
lw r2, h(r0)
lw r3, i(r0)
lw r4, j(r0)
lw r5, k(r0)
lw r6, Temp1(r0)
lw r7, Temp2(r0)
lw r8, Temp3(r0)
lw r9, Temp4(r0)
lw r10, g(r0)
slt r6, r5, r0
bne r6, r0, Exit
slt r6, r5, r7
beq r6, r0, Exit
dadd r7, r5, r5
dadd r7, r7, r7
dadd r7, r7, r8
lw r9, 0(r7)
jr r9
L0: dadd r1, r3, r4
j Exit
L1: dadd r1, r10, r2
j Exit
L2: dsub r1, r3, r4
j Exit
L3: dsub r1, r10, r2
j Exit
Exit:
As the previous code stated $t1 must store the address of JumpTable[k].
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论