为什么这个汇编程序以无限循环结束?
Why do this assembly program end with a infinite loop?
这个程序是我课本上的一个例子,这个程序的目的是计算 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 引脚配置为输出,即使它已经连接到电源或接地。)
这个程序是我课本上的一个例子,这个程序的目的是计算 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 引脚配置为输出,即使它已经连接到电源或接地。)