这个程序是我课本上的一个例子,这个程序的目的是计算N+N-1++2+1,并将结果存储在R1中。为什么它以死循环块结束,它能做什么?
; asm4-1.s
N EQU 10
Stack_Size EQU 0x00000400
AREA MyStack, NOINIT, READWRITE, ALIGN=3
Stack_Mem SPACE Stack_Size
__initial_sp
AREA Reset, DATA, READONLY
__Vectors DCD __initial_sp
DCD Reset_Handler
THUMB
PRESERVE8
AREA Init, CODE, READONLY
ENTRY
Reset_Handler
LDR r0, =N
MOV r1, #0
loop
ADD r1, r0
SUBS r0, #1
BNE loop
deadloop
B deadloop ; Does this create an infinite loop? why is it here
NOP
END
这看起来像是针对ARM微控制器的。
在裸金属上,没有什么可退出的,空的无限循环比运行更多指令使CPU进入睡眠状态更容易。
如果让执行继续进行,它会尝试将内存中的下一个指令作为指令执行,可能会在连接调试器并查看它们之前弄乱寄存器。或者触发连续的重新启动,这将使从外部信号引脚中很难判断引导加载程序实际加载了什么。(例如,因为指令后面的字节发生了故障,而故障处理程序也在其他地方运行垃圾代码,或者其他什么地方。(
或者在一个不那么琐碎的引导加载程序中,可能会导致视频内存中的数据混乱。
还有一种可能性是,在内存中运行随机垃圾作为指令可能会对硬件造成不良影响,这取决于板以及软件必须做什么才能损坏硬件。(例如,将I/O引脚配置为输出,即使它已经连接到电源或接地。(