用简单的英语解释该汇编语言程序的功能

问题描述

    .data
array:  .word   1 2 3 4 5
mfact:  .word   100
dfact:  .word   20

    .text
main:   lui s0,0x10010     # U format  4 cycles
    lw  t0,20(s0)      # I format  5 cycles
    lw  t1,24(s0)      # I format  5 cycles
    or  s1,zero,zero  # R format  4 cycles
    ori s2,5     # I format  4 cycles

loop:   slli    s3,s1,2       # I format  4 cycles
    add s4,s3,s0      # R format  4 cycles
    lw  t2,0(s4)       # I format  5 cycles
    mul t3,t2,t0      # R format  10 cycles
    div t4,t3,t1      # R format  40 cycles
    sw  t4,0(s4)       # S format  4 cycles
    addi    s1,1       # I format  4 cycles
    blt s1,s2,loop    # B format  3 cycles

exit:   ori a7,10    # I format  4 cycles
    ecall           # I format  3 cycles
    

该问题没有更多信息。我认为程序会将数字1-5相除并相乘,直到达到0,然后停止。我对此是否正确?

解决方法

该程序应采用5个单词的数组的每个元素,并将其与数组后的第一个单词相乘,然后将结果除以数组后的第二个元素。但是存在一些问题:
1-您需要在数组的单词之间添加com。
2-您需要将main声明为全局函数,以便链接程序可以找到它。否则,您将遇到未定义的参考错误。
3- lui s0,0x10010可能有问题。您确定链接器会将数组放在此地址吗?您是否修改了链接脚本以强制执行?如果您不确定链接器将执行的操作。最好将数组声明为对象,然后将其直接与lui + addi一起使用。

代码为:

    .data
    .type   array,@object
    .size   array,20
array:  .word   1,2,3,4,5
mfact:  .word   100
dfact:  .word   20

    .text
    .global main
    .type   main,@function
main:
    lui s0,%hi(array)      # U format  4 cycles
    addi s0,s0,%lo(array) # I format  4 cycles
    lw  t0,20(s0)          # I format  5 cycles
    lw  t1,24(s0)          # I format  5 cycles
    or  s1,zero,zero      # R format  4 cycles
    ori s2,5         # I format  4 cycles

loop:
    slli    s3,s1,2       # I format  4 cycles
    add s4,s3,s0          # R format  4 cycles
    lw  t2,0(s4)           # I format  5 cycles
    mul t3,t2,t0          # R format  10 cycles
    div t4,t3,t1          # R format  40 cycles
    sw  t4,0(s4)           # S format  4 cycles
    addi    s1,1       # I format  4 cycles
    blt s1,s2,loop        # B format  3 cycles

exit:
    ori a7,10        # I format  4 cycles
    ecall                   # I format  3 cycles
    .size   main,.-main