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

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

关键修改点

  1. 移除提前返回的代码:删掉pop {r4-r11, pc},避免执行一次像素就退出函数
  2. 合理保存寄存器:仅保存rect函数需要保留的循环变量r1(行)和r2(列),因为pixel会修改r0-r3寄存器,调用后这些值会被破坏
  3. 修正参数传递逻辑:直接传递循环变量到pixel的参数寄存器,无需冗余的r4-r6中转
  4. 恢复循环变量后继续循环:调用pixel并恢复寄存器后,执行列、行的自增与循环判断,确保嵌套循环完整执行

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 19:17:55