B是分支指令,而START一般作为程序段开始的标号。B START 表示跳转至START处重新执行,所以这是一个无限循环的程序。另外不见得所有的ARM汇编结尾都有B START指令,只能说需要循环执行的程序会加这条指令。
不是死循环了吧,估计你的中断设置都没对吧,应该还有个S的汇编文件的,类似于reset handler,irq handler,之类的,跟踪一下就是了。一般来说arm的irq是跳到0x18执行。
b就是跳到当前地址,以上都是中断服务程序的地址入口,如果发生相应的的中断就会跳到相应的中断函数入口地址,例如我按复位键,这是个重启的中断,cpu就会跳到Reset的地址执行,然后执行该地址的程序。b是还没有设置中断处理程序的,就是说当发生其他中断cpu会执行b就是不断跳到当前地址,进入死循环。如果我们编写好中断处理函数,就可以类似Reset中断那样执行。当你学习到中断服务程序的知识后,你自然会明白。
这是汇编里常用的技巧,
你说的halt_loop语句应该完整差不多这样子的
ldr lr,=halt_loopldr pc,=main
halt_loop:
b halt_loop
配置了链接寄存器指向的是halt_loop,在pc跳到主函数运行结束之后,pc的值会指向链接寄存器lr,然后就跳到halt_loop这个死循环上了,这是程序结束至死循环的意思
。。。
MOV SI ,R0
MOV DI,RI
MOV CX,8
LOP: MOV AL,[SI]
MOV [DI],AL
ADD SI,2 ;因为是字所以要加2
ADD DI,2
LOOP LOP
。。。
不过汇编程序是以asm为后缀的。。。
一种方法是在编译器中加上-thumb选项,在编译器中进行设置好了之后编译下,采用的指令集就是Thumb指令集了。二是可以直接在ARM汇编里实现。具体的切换是通过Branch Exchange-即BX 指令来实现的。指令格式为:Thumb状态 BX RnARM状态 BX<condition> Rn其中Rn可以是寄存器R0-R15中的任意一个。指令可以通过将寄存器Rn的内容拷贝到程序计数器PC来完成在4Gbyte地址空间中的绝对跳转,而状态切换是由寄存器Rn的最低位来指定的,如果 *** 作数寄存器的状态位Bit0=0,则进入ARM状态,如果Bit0=1,则进入Thumb状态,以下是一个用例:CODE32 //表示以下使用ARM状态下的代码,32位对齐LDR R0, =Into_Thumb+1 //将Into_Thumb地址值加1,再赋给R0//产生跳转地址并且设置最低位BX R0 //地址值位0为1,将进入THUMB状态//Branch Exchange 进入Thumb状态… CODE16 //Thumb状态下的子函数,16位对齐…LDR R3, =Back_to_ARM //将Back_to_ARM 地址值赋给R0//产生字对齐的跳转地址,最低位被清除,即bit0为0BX R3//Branch Exchange 返回到ARM状态,此时运行在ARM指令集环境里 CODE32 //ARM状态下的子函数Bach_to_ARM
以上就是关于ARM汇编为什么结尾都有B START指令全部的内容,包括:ARM汇编为什么结尾都有B START指令、ARM程序,IntEnable()进入死循环,刚开始学习ARM,求高手指点,谢了 程序如下、ARM 汇编里面 B .跳转到当前地址,那下面程序的b .有什么用呢如果是调到当前地址不是成死循环了吗等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)