程序实现对DCD申请的一片数组内的数据进行冒泡排序
但是在程序内循环截止向存储保存数据时出现了差错
首地址的数值一直不能被保存住,也就是说单步时能看见它的变化,但是在执行下一行时就不行了,数据又变回来了!
- Assembly code
;冒泡排序法实现N EQU 10 AREA EX4_47,CODE,READONLY ENTRY CODE32START LDR R0,=BUF ;数组首地址赋予R0 MOV R1,#0 ;外循环计数器 MOV R2,#0 ;内循环计数器LOOPO ADD R3,R0,R1,LSL #2 ;外循环首地址R3 MOV R4,R3 ;内循环首地址R4 ADD R2,R1,#1 ;修改内循环计数器 MOV R5,R4 ;内循环下一地址初值 LDR R6,[R4] ;内循环第一个值放入R6LOOPI ADD R5,R5,#4 ;内循环下一地址 LDR R7,[R5] ;内循环下一个值R7 CMP R6,R7 BLT NEXT ;小于则内循环下一轮开始 SWP R7,R6,[R5] ; >=就交换 MOV R6,R7NEXT ADD R2,R2,#1 ;修改内循环计数器 CMP R2,#N ;判断内循环退出与否 BLT LOOPI SWP R7,R6,[R3] ;将最小数出入外循环的首地址 ADD R1,R1,#1 ;外循环计数器修改 CMP R1,#N-1 ;外循环退出判断 BLT LOOPO B START AREA BlockData,DATA,READWRITEBUF DCD 0XFF,0X00,0X40,0X10,0X90,0X20,0X80,0X30,0X50,0X70 END
执行SWP R7,R6,[R3]前
执行SWP R7,R6,[R3]后下一句之前
执行下一句后
最终结果
------解决方案--------------------
你要修改的地址好像是flash的,不是ram的,能改掉才怪
------解决方案--------------------
------解决方案--------------------
可能是CACHE导致的假改变. 你的是处理器可能是44B0,你的写操作缓存在CACHE里面,写后立即去读,好像是正确改变了,但实际上它的EMI只会发出RAM写,不会改变FLASH-ROM. 下次再访问又不对了.
------解决方案--------------------
- Assembly code
;冒泡排序法实现N EQU 10 AREA EX4_47,CODE,READONLY ENTRY CODE32START LDR R0,=BUF ;数组首地址赋予R0 MOV R1,#0 ;外循环计数器 MOV R2,#0 ;内循环计数器LOOPO ADD R3,R0,R1,LSL #2 ;外循环首地址R3 MOV R4,R3 ;内循环首地址R4 ADD R2,R1,#1 ;修改内循环计数器 MOV R5,R4 ;内循环下一地址初值 LDR R6,[R4] ;内循环第一个值放入R6LOOPI ADD R5,R5,#4 ;内循环下一地址 LDR R7,[R5] ;内循环下一个值R7 CMP R6,R7 BLT NEXT ;小于则内循环下一轮开始 SWP R7,R6,[R5] ; >=就交换 MOV R6,R7NEXT ADD R2,R2,#1 ;修改内循环计数器 CMP R2,#N ;判断内循环退出与否 BLT LOOPI SWP R7,R6,[R3] ;将最小数出入外循环的首地址 ADD R1,R1,#1 ;外循环计数器修改 CMP R1,#N-1 ;外循环退出判断 BLT LOOPO B START AREA BlockData,DATA,READWRITE,align=4BUF DCD 0XFF,0X00,0X40,0X10,0X90,0X20,0X80,0X30,0X50,0X70 END
------解决方案--------------------
检查一下CP控制寄存器的Align开关是否打开,如果打开,LDR/STR指令操作非4字节对齐内存无效,同样LDRH/STRH操作非2字节对齐内存也无效