ARM汇编骰子随机数生成与数组统计问题求助
排查ARM汇编掷骰子项目问题的关键点
首先,输出全0的核心原因大概率是随机数生成逻辑失效或数组存取值的地址操作错误,结合ARM汇编的常见坑,给你几个具体排查方向:
1. 随机数生成模块的问题
- 若使用伪随机数算法(如线性同余发生器),务必检查初始种子:
- 新手常犯错误是把种子设为0,导致每次生成结果都是0,必须指定非0初始值(比如用寄存器初始值、手动固定值测试)。
- 生成1-6随机数的线性同余发生器ARM汇编示例:
; r0存初始种子,执行后r0返回1-6的随机数 ldr r1, =1103515245 ; LCG乘数 ldr r2, =12345 ; LCG增量 mul r0, r1, r0 ; seed = seed * a + c add r0, r0, r2 ldr r1, =0x7FFFFFFF ; 截取31位正整数 and r0, r0, r1 mov r1, #6 udiv r2, r0, r1 ; 整除6取商 mul r2, r2, r1 sub r0, r0, r2 ; 得到0-5的余数 add r0, r0, #1 ; 转为1-6
- 若调用系统随机数函数(如Linux下
getrandom),检查函数导入、参数传递是否正确,返回值是否被正确读取。
2. 数组存取值的地址错误
- 确认数组基地址加载正确:
- 全局数组需用
ldr rX, =array加载地址,不能直接用mov(ARM立即数有范围限制,会导致地址加载错误)。 - 32位整数数组的存储逻辑示例:
ldr r4, =dice_array ; 数组基地址存入r4 mov r5, #0 ; 索引计数器初始化 store_loop: ; 假设已生成随机数到r0 str r0, [r4, r5, lsl #2] ; 存储:基地址 + 索引*4(32位元素占4字节) add r5, r5, #1 cmp r5, #ARRAY_SIZE blt store_loop
- 全局数组需用
- 检查索引计算:32位数组每个元素占4字节,索引需左移2位(
lsl #2)或乘以4,新手常直接用索引加基地址,导致地址偏移错误、覆盖数据或访问越界。
3. 连续序列统计的逻辑问题
- 先确保数组内容正确后,再排查统计逻辑:
- 初始化计数器时注意:数组长度大于1时,初始连续序列数应为1(至少有一个序列),遍历数组时比较当前元素与前一个,不同则计数器加1。
- 连续序列统计的ARM汇编示例:
mov r6, #1 ; 初始连续序列数设为1 mov r7, #1 ; 从第二个元素开始遍历 count_run_loop: ldr r0, [r4, r7, lsl #2] ; 当前元素 sub r8, r7, #1 ldr r1, [r4, r8, lsl #2] ; 前一个元素 cmp r0, r1 bne increment_run b continue_count increment_run: add r6, r6, #1 continue_count: add r7, r7, #1 cmp r7, r5 blt count_run_loop
4. 打印输出的验证
- 若数组内容正确但打印全0,检查打印函数参数传递:比如用
printf时,32位ARM下参数需按顺序放入r0-r3寄存器,超过的要入栈,确保传递的是数组元素的有效值或正确地址。
如果能附上你的完整汇编代码和C参考代码,可以更精准定位问题。
内容的提问来源于stack exchange,提问作者UnmiLou
相关产品推荐
相关产品推荐

