Assembly 用通俗易懂的英语解释这个汇编语言程序的功能

Assembly 用通俗易懂的英语解释这个汇编语言程序的功能,assembly,riscv,machine-language,Assembly,Riscv,Machine Language,这个问题没有更多的信息。我认为程序将数字1-5进行除法和乘法,直到它达到0,然后停止。我说的对吗?这个程序应该取5个字的数组中的每个元素,并将其与数组后的第一个字相乘,然后将结果与数组后的第二个元素相除。但也存在一些问题: 1-您需要在数组的单词之间添加com。 2-您需要将main声明为全局函数,以便链接器可以找到它。否则将出现未定义的引用错误。 3-lui s0、0x10010可能有问题。您确定链接器将在此地址放置数组吗?您是否修改了链接器脚本以强制执行它?如果您不确定链接器将做什么。最好将

这个问题没有更多的信息。我认为程序将数字1-5进行除法和乘法,直到它达到0,然后停止。我说的对吗?

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

守则如下:

    .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, zero, 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, s1, 1       # I format  4 cycles
    blt s1, s2, loop    # B format  3 cycles

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

我怀疑OP可能是在RARS这样的模拟器中运行他们的代码的,RARS(比如MIPS的MARS)有简单的默认设置,关于.data部分放在哪里。并且可能不需要将
main
设置为
.global
。这些都是很好的更正,但这可能解释了为什么代码在某些环境中可以工作。请注意,您通常可以跳过
addi s0,s0,%lo(数组)
,并在以后的加载中使用它,如
lw t0,%lo(数组)+20(s0)
,只要您知道数组不接近4k边界的末端,这将导致
%lo(数组)+20
不再适合12位符号扩展立即数。
    .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, zero, 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, s1, 1       # I format  4 cycles
    blt s1, s2, loop        # B format  3 cycles

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