如何将地址分配给标签? winmips64

发布于 2025-01-21 04:41:33 字数 2356 浏览 3 评论 0原文

一切都很好,直到我到达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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文