Cortex-M4汇编嵌套循环调用pixel函数异常:仅执行一次后停止
Cortex-M4汇编矩形绘制循环问题修复
核心问题
你的rect函数执行一次pixel调用就终止,根本原因是调用pixel后直接用pop {r4-r11, pc}返回了——这行代码会直接恢复程序计数器pc,相当于从rect函数退出,后面的循环增量、判断逻辑完全没机会执行。
另外还有两处冗余错误:
- 保存了不需要的寄存器(r4-r11),且保存时机不合理
- 调用
pixel后执行mov r2, r0,会覆盖循环变量r2(当前列)的值
修复后的代码
.text .global pixel .thumb_func .align // Draws the pixel word passed in R2 to the pixel location given by the column in R0 and the row in R1 pixel: // r0 = 列 (输入) // r1 = 行 (输入) // r2 = 颜色值 (输入) mov r3, #240 mul r1, r3 // 计算行偏移:row * 240 add r1, r0 // 计算像素索引:(row * 240) + col ldr r0, =DISPLAY // 加载显示缓冲区地址 str r2, [r0, r1, lsl #2] // 将颜色值写入对应像素地址(索引*4,因为每个像素占4字节) bx lr // 返回调用者 .global rect .thumb_func .align // Fills in a rectangle with the pixel word passed in R0. // 绘制区域:(50,150) 到 (149,249)(包含边界) rect: mov r3, r0 // 保存颜色值到r3(避免被后续操作覆盖) mov r1, #150 // 初始化起始行 loopi: mov r2, #50 // 初始化当前行的起始列 loopj: // 保存循环变量:当前行(r1)、当前列(r2),因为pixel会修改r0-r3 push {r1, r2} // 设置pixel的参数:r0=列, r1=行, r2=颜色 mov r0, r2 mov r2, r3 bl pixel // 调用绘制单个像素 // 恢复循环变量 pop {r1, r2} // 列循环:列自增,直到达到150(因为149是最后一列,所以判断小于150) add r2, #1 cmp r2, #150 blo loopj // 行循环:行自增,直到达到250(249是最后一行) add r1, #1 cmp r1, #250 blo loopi bx lr // 矩形绘制完成,返回 .end
关键修改点
- 移除提前返回的代码:删掉
pop {r4-r11, pc},避免执行一次像素就退出函数 - 合理保存寄存器:仅保存
rect函数需要保留的循环变量r1(行)和r2(列),因为pixel会修改r0-r3寄存器,调用后这些值会被破坏 - 修正参数传递逻辑:直接传递循环变量到
pixel的参数寄存器,无需冗余的r4-r6中转 - 恢复循环变量后继续循环:调用
pixel并恢复寄存器后,执行列、行的自增与循环判断,确保嵌套循环完整执行
内容的提问来源于stack exchange,提问作者Jer
相关产品推荐
相关产品推荐

