智能小车35:从汇编指令bne聊起

今天学习韦东山老师的《存储管理器实验》这节课时出现了以下汇编代码,由于没有系统的学习过汇编指令,下面的代码真是不懂。

1:
ldr r4, [r1],#4 @ 从Steppingstone读取4字节的数据,并让源地址加4
str r4, [r2],#4 @ 将此4字节的数据复制到SDRAM中,并让目地地址加4
cmp r1, r3 @ 判断是否完成:源地址等于Steppingstone的未地址?
bne 1b @ 若没有复制完,继续
mov pc, lr @ 返回

其中最困惑的就是这个bne指令,从来没见过,老师说这个是循环跳转用的。但我不明白的是我们写java或c时都是for之类,循环体都是包在一个范围内的,这个东东没有什么范围。经过查找学习一些资料,终于明白了。

bne是一个跳转指令,它来源于b指令。b指令可以通过使用文档查到如下用法:


而这个cond中就有一个值是ne,最后组成了bne指令,下图是所有的cond:

再来说一下1b是什么意思:

b这条语句里的b是backward的意思,既然有backward就有forward,所有还有bne 1f语句。1就是段名为1的段。


再结合cmp指令,就是说r1寄存器的地址与r3寄存器的地址不相等时就跳到1段执行,循环就是这样产生的。


最后回顾下这个存储管理器讲的什么内容,我理解就是如何用上sdram(相当于硬盘)。下面的代码已经标出这4步。

_start:
bl disable_watch_dog @ 1.关闭WATCHDOG,否则CPU会不断重启
bl memsetup @ 2.设置存储控制器(设置BANK地址,以便让cpu能用上sdram)
bl copy_steppingstone_to_sdram @ 3.复制代码到SDRAM中
ldr pc, =on_sdram @ 4.跳到SDRAM中继续执行
on_sdram:
ldr sp, =0x34000000 @ 设置堆栈
bl main
halt_loop:
b halt_loop


另外今天看了电影《变形金刚5-最后的骑式》,里面的小机器人吉娃娃好牛逼,希望有一天能做一个。这需要懂嵌入式与人工智能才行。


而我的机器人目前只能做到这样...

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值