汇编实现:将指定数字乘法表加载至数据段数组
问题分析与修正方案
你的代码核心逻辑是通过累加实现乘法,但缺少结果存入数组的关键步骤,同时存在寄存器初始化不完整的问题。以下是修正后的代码及关键说明:
修正后的完整代码
.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
相关产品推荐
相关产品推荐

