【问题标题】:Explain what this assembly language program does in plain English用简单的英语解释这个汇编语言程序的作用
【发布时间】:2021-02-13 22:41:55
【问题描述】:
    .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
    

该问题没有更多信息。我认为程序将数字 1-5 相乘,直到达到 0 然后停止。我说的对吗?

【问题讨论】:

    标签: assembly riscv machine-language


    【解决方案1】:

    这个程序应该把一个5字数组的每个元素与数组后面的第一个字相乘,然后将结果与数组后面的第二个元素相除。但是有一些问题:
    1-您需要在数组的单词之间添加 com。
    2-您需要将 main 声明为全局函数,以便链接器可以找到它。否则会出现未定义的引用错误。
    3- lui s0, 0x10010 可能有问题。您确定链接器会将数组放在此地址吗?您是否修改了链接描述文件以强制它?如果您不确定链接器会做什么。最好把数组声明为对象,直接和and 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, 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
    

    【讨论】:

    • 我怀疑 OP 可能一直在像 RARS 这样的模拟器中运行他们的代码,RARS(如 MIPS 的 MARS)对于 .data 部分的放置位置有简单的默认设置。并且可能不需要main 成为.global。这些都是很好的更正,但这可能解释了为什么代码在某些环境中完全有效。
    • 请注意,您通常可以跳过 addi s0, s0, %lo(array),并在以后的加载中使用它,例如 lw t0, %lo(array)+20(s0),只要您知道数组不接近 4k 边界的末端即可使 %lo(array)+20 不再适合 12 位符号扩展立即数。
    猜你喜欢
    • 1970-01-01
    • 2018-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多