4868|10

64

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

ARM汇编向存储器保存数据 [复制链接]

程序实现对DCD申请的一片数组内的数据进行冒泡排序
但是在程序内循环截止向存储保存数据时出现了差错
首地址的数值一直不能被保存住,也就是说单步时能看见它的变化,但是在执行下一行时就不行了,数据又变回来了!
  1. ;冒泡排序法实现
  2. N EQU 10
  3.             AREA EX4_47,CODE,READONLY
  4.             ENTRY
  5.             CODE32
  6. START       LDR R0,=BUF                ;数组首地址赋予R0
  7.             MOV R1,#0                  ;外循环计数器
  8.             MOV R2,#0                  ;内循环计数器
  9. LOOPO       ADD R3,R0,R1,LSL #2        ;外循环首地址R3
  10.             MOV R4,R3                  ;内循环首地址R4
  11.             ADD R2,R1,#1               ;修改内循环计数器
  12.             MOV R5,R4                  ;内循环下一地址初值
  13.             LDR R6,[R4]                ;内循环第一个值放入R6
  14. LOOPI       ADD R5,R5,#4               ;内循环下一地址
  15.             LDR R7,[R5]                ;内循环下一个值R7
  16.             CMP R6,R7
  17.             BLT NEXT                   ;小于则内循环下一轮开始
  18.             SWP R7,R6,[R5]             ; >=就交换
  19.             MOV R6,R7
  20. NEXT        ADD R2,R2,#1               ;修改内循环计数器
  21.             CMP R2,#N                  ;判断内循环退出与否
  22.             BLT LOOPI
  23.             SWP R7,R6,[R3]             ;将最小数出入外循环的首地址
  24.             ADD R1,R1,#1               ;外循环计数器修改
  25.             CMP R1,#N-1                ;外循环退出判断
  26.             BLT LOOPO
  27.             B START
  28.             AREA BlockData,DATA,READWRITE
  29. BUF         DCD 0XFF,0X00,0X40,0X10,0X90,0X20,0X80,0X30,0X50,0X70
  30.             END
复制代码

执行SWP R7,R6,[R3]前

执行SWP R7,R6,[R3]后下一句之前

执行下一句后

最终结果
此帖出自ARM技术论坛

最新回复

关于arm汇编中的align   .align n   它的含义就是使得下面的代码按一定规则对齐,.align n 指令的对齐值有两种方案,n 或 2^n ,各种平台最初的汇编器一般都不是gas,采取方案1或2的都很多,gas的目标是取代原来的汇编器,必然要保持和原来汇编器的兼容,因此在gas中如何解释 .align指令会显得有些混乱,原因在于保持兼容。   arm-linu是按照2^n的方案对齐的,需要说明的是这个对齐和ld-script里的对齐不同,不是一会事。下面的英文就不同平台的对齐进行了说明:   版本2.11.92.0.12的gas的info(Mandrake 8.2上的)这样说:   The way the required alignment is specified varies from system to system. For the a29k, hppa, m68k, m88k, w65, sparc, and Hitachi SH, and i386 using ELF format, the first expression is the alignment request in bytes. For example `.align 8' advances the location counter until it is a multiple of 8. If the location counter is already a multiple of 8, no change is needed.   For other systems, including the i386 using a.out format, and the arm and strongarm, it is the number of low-order zero bits the location counter must have after advancement. For example `.align 3' advances the location counter until it a multiple of 8. If the location counter is already a multiple of 8, no change is needed.   从这段文字来看,ARM的.align 5就是2的5次方对齐,也就是4字节对齐,通过反汇编也可以看出对齐方式:   .align 5   stmfd sp!, {r0 - r3, lr}   mov r0, ip   ldmfd sp!, {r0 - r3, pc}^   .align 5   stmfd sp!, {r0 - r3, lr}   mov r0, ip   mov ip, r0   ldmfd sp!, {r0 - r3, pc}^   反汇编:   00000000 :   0: e92d400f stmdb sp!, {r0, r1, r2, r3, lr}   4: e1a0000c mov r0, ip   8: e8fd800f ldmia sp!, {r0, r1, r2, r3, pc}^   ...   20: e92d400f stmdb sp!, {r0, r1, r2, r3, lr}   24: e1a0000c mov r0, ip   28: e1a0c000 mov ip, r0   2c: e8fd800f ldmia sp!, {r0, r1, r2, r3, pc}^   30: e1a00000 nop (mov r0,r0)   34: e1a00000 nop (mov r0,r0)   38: e1a00000 nop (mov r0,r0)   3c: e1a00000 nop (mov r0,r0)   一些忠告:   In the future, everytime when you build an elf file, you need meantime created your map file. And then you will avoid mistakes like this align.   Also, please also pick up some linker script knowlege part. For embedded system, we frequently play the linker script to tune an image, for example, align some special section and so on for protection or/and cache purpose. wish helpful   以上就是我在网上找到并总结的有关.align的一些内容   详情 回复 发表于 2010-2-25 22:18
点赞 关注
 

回复
举报

80

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
你要修改的地址好像是flash的,不是ram的,能改掉才怪
此帖出自ARM技术论坛
 
 
 

回复

74

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
引用 1 楼 arnold9009 的回复:
你要修改的地址好像是flash的,不是ram的,能改掉才怪


呵呵,不是好像是肯定,地址那么小,flashrom的修改需要特殊指令,先unlock flashrom再写入数据,具体看datasheet
此帖出自ARM技术论坛
 
 
 

回复

75

帖子

0

TA的资源

一粒金砂(初级)

4
 
可能是CACHE导致的假改变. 你的是处理器可能是44B0,你的写操作缓存在CACHE里面,写后立即去读,好像是正确改变了,但实际上它的EMI只会发出RAM写,不会改变FLASH-ROM. 下次再访问又不对了.
此帖出自ARM技术论坛
 
 
 

回复

76

帖子

0

TA的资源

一粒金砂(高级)

5
 
引用 1 楼 arnold9009 的回复:
你要修改的地址好像是flash的,不是ram的,能改掉才怪


那么为什么数组后面的几位能改呢
此帖出自ARM技术论坛
 
 
 

回复

78

帖子

0

TA的资源

一粒金砂(初级)

6
 
引用 2 楼 codesnail 的回复:
引用 1 楼 arnold9009 的回复:
你要修改的地址好像是flash的,不是ram的,能改掉才怪


呵呵,不是好像是肯定,地址那么小,flashrom的修改需要特殊指令,先unlock flashrom再写入数据,具体看datasheet



呵呵!我是新手!我是用的AXD仿真,还真搞不懂哪里是什么!他们有什么差别吗?datasheet在哪里能找到?
此帖出自ARM技术论坛
 
 
 

回复

72

帖子

0

TA的资源

一粒金砂(初级)

7
 
引用 3 楼 great_bug 的回复:
可能是CACHE导致的假改变. 你的是处理器可能是44B0,你的写操作缓存在CACHE里面,写后立即去读,好像是正确改变了,但实际上它的EMI只会发出RAM写,不会改变FLASH-ROM. 下次再访问又不对了.


高手呀!我用的是AXD仿真选的ARM920T!CACHE是什么?哪一部分的?我现在刚开头在学的一本叫做ARM体系的汇编语言!能不能给指点一下学习的路径呀!小弟当尽心回报!
此帖出自ARM技术论坛
 
 
 

回复

74

帖子

0

TA的资源

一粒金砂(初级)

8
 

  1. ;冒泡排序法实现
  2. N EQU 10
  3.             AREA EX4_47,CODE,READONLY
  4.             ENTRY
  5.             CODE32
  6. START       LDR R0,=BUF                ;数组首地址赋予R0
  7.             MOV R1,#0                  ;外循环计数器
  8.             MOV R2,#0                  ;内循环计数器
  9. LOOPO       ADD R3,R0,R1,LSL #2        ;外循环首地址R3
  10.             MOV R4,R3                  ;内循环首地址R4
  11.             ADD R2,R1,#1               ;修改内循环计数器
  12.             MOV R5,R4                  ;内循环下一地址初值
  13.             LDR R6,[R4]                ;内循环第一个值放入R6
  14. LOOPI       ADD R5,R5,#4               ;内循环下一地址
  15.             LDR R7,[R5]                ;内循环下一个值R7
  16.             CMP R6,R7
  17.             BLT NEXT                   ;小于则内循环下一轮开始
  18.             SWP R7,R6,[R5]             ; >=就交换
  19.             MOV R6,R7
  20. NEXT        ADD R2,R2,#1               ;修改内循环计数器
  21.             CMP R2,#N                  ;判断内循环退出与否
  22.             BLT LOOPI
  23.             SWP R7,R6,[R3]             ;将最小数出入外循环的首地址
  24.             ADD R1,R1,#1               ;外循环计数器修改
  25.             CMP R1,#N-1                ;外循环退出判断
  26.             BLT LOOPO
  27.             B START
  28.             AREA BlockData,DATA,READWRITE,align=4
  29. BUF         DCD 0XFF,0X00,0X40,0X10,0X90,0X20,0X80,0X30,0X50,0X70
  30.             END
复制代码


把代码改成上面那样子就没问题.
猜测:ARMulator对CODE段进行仿真的时候,默认它为只读的,且至少为16字节一个单元
此帖出自ARM技术论坛
 
 
 

回复

80

帖子

0

TA的资源

一粒金砂(初级)

9
 
引用 7 楼 great_bug 的回复:
Assembly code;冒泡排序法实现N EQU10
            AREA EX4_47,CODE,READONLY
            ENTRY
            CODE32
START       LDR R0,=BUF;数组首地址赋予R0MOV R1,#0;外循环计数器MOV R2,#0;内循环计数器LOOPOADD R3,R0,R1,LSL #2;外循环首地址R3MOV R4,R3;内循环首地址R4ADD R2,R1,#1;修改内循环计数器MOV R5,R4;内循环下一地址初值            LDR R6,[R4];内循环第一个值放入R6LOOPIADD R5,R5,#4;内循环下一地址            LDR R7,[R5];内循环下一个值R7CMP R6,R7
            BLT NEXT;小于则内循环下一轮开始            SWP R7,R6,[R5]; >=就交换MOV R6,R7
NEXTADD 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=4
BUF         DCD0XFF,0X00,0X40,0X10,0X90,0X20,0X80,0X30,0X50,0X70
            END

把代码改成上面那样子就没问题.
猜测:ARMulator对CODE段进行仿真的时候,默认它为只读的,且至少为16字节一个单元




的确加了地址对齐就没有问题了!能不能详细一点给我解释一下呀!谢谢啦!还有楼上所说的那些flash和ram差别问题在哪里能找到呢?
此帖出自ARM技术论坛
 
 
 

回复

76

帖子

0

TA的资源

一粒金砂(初级)

10
 
检查一下CP控制寄存器的Align开关是否打开,如果打开,LDR/STR指令操作非4字节对齐内存无效,同样LDRH/STRH操作非2字节对齐内存也无效
此帖出自ARM技术论坛
 
 
 

回复

75

帖子

0

TA的资源

一粒金砂(初级)

11
 
关于arm汇编中的align
  .align n
  它的含义就是使得下面的代码按一定规则对齐,.align n 指令的对齐值有两种方案,n 或 2^n ,各种平台最初的汇编器一般都不是gas,采取方案1或2的都很多,gas的目标是取代原来的汇编器,必然要保持和原来汇编器的兼容,因此在gas中如何解释 .align指令会显得有些混乱,原因在于保持兼容。
  arm-linu是按照2^n的方案对齐的,需要说明的是这个对齐和ld-script里的对齐不同,不是一会事。下面的英文就不同平台的对齐进行了说明:
  版本2.11.92.0.12的gas的info(Mandrake 8.2上的)这样说:
  The way the required alignment is specified varies from system to system. For the a29k, hppa, m68k, m88k, w65, sparc, and Hitachi SH, and i386 using ELF format, the first expression is the alignment request in bytes. For example `.align 8' advances the location counter until it is a multiple of 8. If the location counter is already a multiple of 8, no change is needed.
  For other systems, including the i386 using a.out format, and the arm and strongarm, it is the number of low-order zero bits the location counter must have after advancement. For example `.align 3' advances the location counter until it a multiple of 8. If the location counter is already a multiple of 8, no change is needed.
  从这段文字来看,ARM的.align 5就是2的5次方对齐,也就是4字节对齐,通过反汇编也可以看出对齐方式:
  .align 5
  stmfd sp!, {r0 - r3, lr}
  mov r0, ip
  ldmfd sp!, {r0 - r3, pc}^
  .align 5
  stmfd sp!, {r0 - r3, lr}
  mov r0, ip
  mov ip, r0
  ldmfd sp!, {r0 - r3, pc}^
  反汇编:
  00000000 <.text>:
  0: e92d400f stmdb sp!, {r0, r1, r2, r3, lr}
  4: e1a0000c mov r0, ip
  8: e8fd800f ldmia sp!, {r0, r1, r2, r3, pc}^
  ...
  20: e92d400f stmdb sp!, {r0, r1, r2, r3, lr}
  24: e1a0000c mov r0, ip
  28: e1a0c000 mov ip, r0
  2c: e8fd800f ldmia sp!, {r0, r1, r2, r3, pc}^
  30: e1a00000 nop (mov r0,r0)
  34: e1a00000 nop (mov r0,r0)
  38: e1a00000 nop (mov r0,r0)
  3c: e1a00000 nop (mov r0,r0)
  一些忠告:
  In the future, everytime when you build an elf file, you need meantime created your map file. And then you will avoid mistakes like this align.
  Also, please also pick up some linker script knowlege part. For embedded system, we frequently play the linker script to tune an image, for example, align some special section and so on for protection or/and cache purpose. wish helpful
  以上就是我在网上找到并总结的有关.align的一些内容
此帖出自ARM技术论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表