You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

汇编实现:将指定数字乘法表加载至数据段数组

问题分析与修正方案

你的代码核心逻辑是通过累加实现乘法,但缺少结果存入数组的关键步骤,同时存在寄存器初始化不完整的问题。以下是修正后的代码及关键说明:

修正后的完整代码

.data
myArray db 10 dup (0)  ; 仅需10个字节存储1-10的乘法结果,无需1000个

.code
      MOV     R0, #8       ; 用户输入的数字(范围0-10)
      LDR     R1, =myArray ; 将数组起始地址存入R1(最终需保留该地址)
      MOV     R2, #0       ; R2用于存储当前乘法结果(初始化为0)
      MOV     R10, #0      ; 计数器初始化为0(循环10次,对应1-10倍)
      MOV     R11, #9      ; 循环终止条件:计数器到9时结束(共执行10次)

loop   
      ADD     R2, R2, R0   ; 累加R0,得到R0*(R10+1)(计数器从0开始,对应1到10的倍数)
      STRB    R2, [R1], #1 ; 将结果存入当前数组位置,随后地址自动+1(指向下一个元素)
      ADD     R10, R10, #1 ; 计数器加1
      CMP     R11, R10     ; 判断是否完成10次循环
      BMI     finish       ; 计数器超过9时退出循环
      B       loop         ; 未完成则继续循环

finish 
      LDR     R1, =myArray ; 重新将数组起始地址存入R1(循环中R1已自增到数组末尾)
      end

关键修正点说明

  • 数组地址初始化:用LDR R1, =myArray将数组起始地址加载到R1,这是访问数组的基础前提。
  • 结果存储指令:STRB R2, [R1], #1是核心操作:
    • STRB:因为数组定义为db(字节类型),且0-10的乘法结果最大值为100,完全在字节存储范围内,所以使用字节存储指令。
    • [R1], #1:将R2的值存入R1指向的内存地址后,R1自动加1,直接指向下一个数组元素,实现结果的依次存储。
  • 寄存器初始化:必须清零R10(计数器)和R2(结果寄存器),避免内存垃圾值影响计算逻辑。
  • 循环后恢复R1:循环过程中R1会自增到数组末尾,因此最后需要重新加载数组起始地址到R1,满足需求中“将结果数组的地址存入R1”的要求。

可选优化方案

如果你的汇编环境支持MUL指令,也可以直接用乘法替代累加逻辑,代码逻辑更直观:

loop   
      ADD     R10, R10, #1 ; 计数器从1到10
      MUL     R2, R0, R10  ; 直接计算R0*R10
      STRB    R2, [R1], #1
      CMP     R10, #10     ; 判断是否完成10次计算
      BLT     loop

内容的提问来源于stack exchange,提问作者Arturo0504

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 10:30:42