设计素材网站排版,网站聚合页面怎么做,wordpress外贸网店主题,代理服务器在哪里找内容主要来自M3内核权威指南 汇编程序中的最低有效位#xff08;Least Significant Bit#xff09;。LSB是二进制数中最右边的位#xff0c;它代表了数值中的最小单位。在汇编程序中#xff0c;LSB通常用于表示数据的最小精度或者作为标志位。
---------…内容主要来自M3内核权威指南 汇编程序中的最低有效位Least Significant Bit。LSB是二进制数中最右边的位它代表了数值中的最小单位。在汇编程序中LSB通常用于表示数据的最小精度或者作为标志位。
-----------在执行 PUSH 和 POP 操作时那个通常被称为 SP(R13或写作 SP 的地址寄存器会自动被调整 以避免后续的操作破坏先前的数据。
--------------------------------
(;后面是注释,前面是汇编)
subroutine_1
PUSH {R0-R7, R12, R14} ; 保存寄存器列表
… ; 执行处理
POP {R0-R7, R12, R14} ; 恢复寄存器列表
BX R14 ; 返回到主调函数
--------------------------------- subroutine_1
这是一个标签标识了子程序subroutine_1的开始位置。其他地方的代码可以通过跳转到这个标签来执行这个子程序。
PUSH {R0-R7, R12, R14}
PUSH指令用于将寄存器的内容压入堆栈。在这里它压入了R0到R7连续的八个寄存器R12和R14这三个寄存器的当前值到堆栈上。这样做是为了在子程序执行期间保存这些寄存器的原始值防止子程序修改这些值影响到调用它的代码。
…
这里省略了子程序中的其他指令或代码
POP {R0-R7, R12, R14}
POP指令用于从堆栈中弹出值并加载到寄存器中。这里它恢复了之前通过PUSH指令压入堆栈的寄存器的值。这样当子程序返回时这些寄存器的值就像子程序从未被调用过一样。
BX R14
BX指令用于跳转到由寄存器指定的地址。在这里它跳转到R14寄存器中存储的地址。在ARM汇编中R14通常称为LRLink Register通常用于存储子程序返回地址。因此这条指令实际上是使子程序返回到它被调用的地方。 -------------- R14 是连接寄存器LR
main ;主程序
…
BL function1 ; 使用“分支并连接”指令呼叫 function1 ; PC function1并且 LRmain 的下一条指令地址
…
Function1
… ; function1 的代码
BX LR ; 函数返回如果 function1 内部还要使用 LR必须在使用前 PUSH ; 否则返回时程序就可能跑飞了——译注)
------------------------------------ main ;主程序
这表示主程序的入口点。 2. …
表示省略了一些代码或指令。 3. BL function1
BL是一个指令用于跳转到function1。在汇编语言中BL或类似的指令用于调用子程序或函数。在这里它调用了一个名为function1的函数或子程序。 4. …
再次表示省略了一些代码或指令。 6. Function1
是function1的开始。在汇编语言中函数或子程序通常有一个标签来标识它们的开始这样其他代码可以跳转到这个标签来执行该函数的代码。 7. … ;
function1 的代码 8. BX LR
BX和LR是指令和寄存器。BX通常用于跳转到某个地址而LRLink Register通常用于存储返回地址。在许多架构中当从子程序返回时LR会存储调用子程序之前的地址这样程序可以继续执行。
所以BX LR用于从function1返回到之前调用它的地方即BL function1之后的代码。
----------------R15 是程序计数器(PC)
0x1000: MOV R0, PC ; R0 0x1004
0x1000 是这条指令本身的地址。当 MOV R0, PC 执行时它会把 PC 的当前值即这条指令后面的地址移动到 R0 寄存器中。
通常情况下在指令 MOV R0, PC 执行后PC 的值已经自增到了下一条指令的地址。因此如果 MOV R0, PC 这条指令位于地址 0x1000那么 PC 的值在执行这条指令时将会是 0x1004(假设每条指令占用 4 个字节的空间)
这里的逻辑是PC 总是指向下一条要执行的指令所以当 MOV R0, PC 执行时它实际上是把下一条指令的地址即 0x1004存到了 R0 寄存器中。
------------------------
PUSH/POP 指令支持一次操作多个寄存器。像这样
PUSH {R0-R2} ;压入 R0-R2
PUSH {R3-R5,R8, R12} ;压入 R3-R5,R8以及 R12
在 POP 时可以如下操作
POP {R0-R2} ;弹出 R0-R2
POP {R3-R5,R8, R12} ;弹出 R3-R5R8以及 R12
注意不管在寄存器列表中寄存器的序号是以什么顺序给出的汇编器都将把它们升 序排序。然后 PUSH 指令按照从大到小的顺序依次入栈POP 则按从小到大的顺序依次出栈。 如果不按升序写寄存器有些汇编器可能会给出一个语法错误。
PUSH/POP 对子还有这样一种特殊形式形如
PUSH {R0-R3, LR}
POP {R0-R3, PC}
请注意POP 的最后一个寄存器是 PC并不是先前 PUSH 的 LR。这其实是一个返回的小 技巧。因为总要把先前 LR 的值弹出来再使用此值返回干脆绕过 LR直接传给 PC LR 在子程序返回时的唯一用处就是提供返回地址在 返回后先前保存的返回地址就没有利用价值了所以只要 PC 得到了正确的值不恢复也 没关系