智能小车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-最后的骑式》,里面的小机器人吉娃娃好牛逼,希望有一天能做一个。这需要懂嵌入式与人工智能才行。


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

文/中中 浏览次数:0次   2017-10-04 22:37:35

相关阅读


评论: