求助:如何用汇编实现128位位域的上升沿统计?
问题解决:统计128位位域中的"01"上升沿数量
原代码存在的问题
- 未处理完整128位数据:仅加载了
R7指向的第一个寄存器,没有遍历全部8个16位寄存器(128位=8×16位)。 - 指令语法错误:
CJNE指令需要完整操作数(待比较值、参考值、跳转标签),原代码写法不符合语法规范。 - 逻辑错误:没有正确捕获"01"位模式——需要记录前一位状态,移位后对比当前位与前一位是否构成0→1的上升沿。
修正后的实现思路
- 遍历
R7指向的8个16位寄存器,覆盖完整128位数据。 - 对每个寄存器的每一位,保存前一位状态,移位后获取当前位,判断是否为
0→1的变化。 - 每检测到一次"01"模式,将结果寄存器
R5加1。
修正后的汇编代码(以MSP430架构为例)
COUNT_01_NOMOD: MOV #8, R4 ; 128位需处理8个16位寄存器 CLR R5 ; 初始化结果寄存器R5为0 MOV R7, R3 ; 保存基地址到R3,避免修改原始输入R7 next_reg: MOV @R3+, R6 ; 加载当前寄存器数据,基地址自增 MOV #16, R2 ; 每个寄存器处理16位 CLR R1 ; R1保存前一位的值,初始为0(假设位域最高位前补0) next_bit: RRC R6 ; 右移一位,将当前位移到进位位C JC check_prev_zero ; 当前位是1时,检查前一位是否为0 MOV #0, R1 ; 当前位是0,更新前一位记录为0 DJNZ R2, next_bit ; 未处理完16位,继续 DJNZ R4, next_reg ; 未处理完8个寄存器,继续 RET check_prev_zero: CMP #0, R1 ; 检查前一位是否为0 JNZ skip_inc ; 前一位不是0,不计数 INC R5 ; 检测到"01"模式,结果+1 skip_inc: MOV #1, R1 ; 更新前一位记录为1 DJNZ R2, next_bit ; 继续处理下一位 DJNZ R4, next_reg ; 处理完当前寄存器,切换到下一个 RET
代码说明
- 用
R4计数需处理的寄存器总数,R2计数每个寄存器的位数,确保覆盖全部128位数据。 - 通过
RRC指令移位,利用进位位获取当前位状态,结合R1保存的前一位状态判断上升沿。 - 遍历完成后,
R5中即为"01"模式的总数量。
内容的提问来源于stack exchange,提问作者Rafael Barroso
相关产品推荐
相关产品推荐

