13572185776的个人空间 https://blog.eetop.cn/870607 [收藏] [复制] [分享] [RSS]

空间首页 动态 记录 日志 相册 主题 分享 留言板 个人资料

日志

汇编的跳转指令

已有 633 次阅读| 2014-3-14 08:12

下面一段程序摘自《嵌入式Linux应用开发完全手册》page-95

memsetup:
     @ 设置存储控制器以便使用SDRAM等外设

    mov r1,     #MEM_CTL_BASE   @ 存储控制器的13个寄存器的开始地址
    adrl    r2, mem_cfg_val              @ 这13个值的起始存储地址
    add r3,     r1, #52                       @ 13*4 = 54
 1: 
     ldr r4,     [r2], #4            @ 读取设置值,并让r2加4
     str r4,     [r1], #4            @ 将此值写入寄存器,并让r1加4
     cmp r1,     r3                 @ 判断是否设置完所有13个寄存器
    bne 1b                          @ 若没有写成,继续
    mov pc,     lr                 @ 返回

 

bne 1b什么意思呢?一开始老是在找1b的标号处,找了些许时间也没有发现哪里有这个标号。

后来查找相关资料发现,原来0~9的数字为局部标签。局部标签可以重复使用,语法为:

xf:往前跳的意思,就是还未执行的程序,x代表0~9的某个标签,f代表forward的意思。

xb:往后跳的意思,回到原来已经执行过的语句,x达标0~9的某个标签,b代表backward的意思。

 

上面bne 1b 的意思是,如果r1!=r3 即r1的地址的不等于r3的地址,也就是还没设置完

这13个寄存器,就要重新跳到
1: 
     ldr r4,     [r2], #4            @ 读取设置值,并让r2加4
     str r4,     [r1], #4            @ 将此值写入寄存器,并让r1加4
     ......

处执行;直到r1=r3,即设置好这13个寄存器。才会结束这个局部循环。

——————————————————————————————————————

eg:

1: ;A
 cmp r0, #0
 beq 1f ;    @  r0==0那么向前跳转到B处执行
bne 1b ;   @ 否则向后跳转到A处执行
1: ;B

——————————————————————————————————————

有趣的是:

1:b 1b   @无限循环的意思,与while(1)等效


点赞

评论 (0 个评论)

facelist

您需要登录后才可以评论 登录 | 注册

  • 关注TA
  • 加好友
  • 联系TA
  • 0

    周排名
  • 0

    月排名
  • 0

    总排名
  • 0

    关注
  • 1

    粉丝
  • 0

    好友
  • 0

    获赞
  • 1

    评论
  • 226

    访问数
关闭

站长推荐 上一条 /1 下一条

小黑屋| 关于我们| 联系我们| 在线咨询| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-4-29 01:12 , Processed in 0.023741 second(s), 14 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
返回顶部