JVM 运行时内存:程序计数器 - 2. 程序计数器的基本特征
最编程
2024-05-21 06:56:25
...
JVM 中的程序计数寄存器(Program Counter Register)中, Register 的命名源于CPU的寄存器,寄存器存储指令相关的现场信息。 CPU只有把数据装载到寄存器才能够运行。
这里,并非是广义上所指的物理寄存器,或许将其翻译为PC计数器(或指令计数器)会更加贴切(也称为程序钩子) ,并且也不容易引起一些不必要的误会。JVM中的PC寄存器是对物理PC寄存器的一种抽象模拟。
- 它是一块很小的内存空间,几乎可以忽略不记。也是运行速度最快的存储区域。不会随着程序的运行需要更大的空间。
- 在JVM规范中,每个线程都有它自己的程序计数器,是线程私有的,生命周期与线程的生命周期保持一致。
- 它是唯一一个在Java 虚拟机规范中没有规定任何OutOtMemoryError 情况的区域。
推荐阅读
-
JVM 运行时内存:程序计数器 - 2. 程序计数器的基本特征
-
JVM 的本地方法堆栈、程序计数器和堆
-
ARM汇编(2)(指令)-跳转指令B与BL都可以使程序跳转到指定的地址执行程序。指令BL的作用是跳转的同时将下一条指令的地址复制到R14(即返回地址连接寄存器LR)寄存器中。需要注意的是,这两条指令和目标地址处的指令都要属于ARM指令集。两条指令都可以根据CPSR中的条件标志位的值决定指令是否执行。 MOVEQ PC, LR B LAB1 (1)指令格式 B {L} {<cond>} <target_address> (2)指令的例子 循环10次的例子 MOV R1, #0 BL MOV R2, #1 ...... LAB1: ADD R1, R1, #1 CMP R1, #10 @带连接的分支 load_new_format: BL switch_screen_mode BL get_screen_info BL load_palette new_loop: MOV R1, R5 BL read_byte CMP R0, #255 BLEQ read_loop STRB R0, [R2, #1]! Load/Store指令 *LDR指令 (1)指令语法格式 LDR指令用于从内存中将一个32位的字读取到目标寄存器。 指令的编码格式如图所示。 LDR指令编码格式 LDR{<cond>} <Rd>,<addr_mode> (2)指令举例 LDR r1,[r0,#0x12] ;将r0+12地址处的数据读出,保存到r1中(r0的值不变) LDR r1,[r0] ;将r0地址处的数据读出,保存到r1中(零偏移) LDR r1,[r0,r2] ;将r0+r2地址的数据读出,保存到r1中(r0的值不变) LDR r1,[r0,r2,LSL #2] ;将r0+r2×4地址处的数据读出,保存到r1中(r0,r2的值不变) LDR Rd,label ;label为程序标号,label必须是当前指令的±4KB范围内 LDR Rd,[Rn],#0x04 ;Rn的值用作传输数据的存储地址。在数据传送后将偏移量0x04与 Rn相加,结果写回到Rn中。Rn不允许是r15 注意:(1)地址对齐问题:大多数情况下,必须保证用于32位传送的地址是32位对齐的。 (2)LDR有两种形式,一种是指令,一种是伪指令,使用LDR的伪指令时,在第二个操作数前加"=" *STR指令用于将一个32位的字写入到指令中指定的内存单元 (1) 指令的语法格式 STR {<cond>} <Rd>, <addr_mode> (2) 指令举例 LDR/STR指令用于对内存变量的访问、内存缓冲区数据的访问、查表、外围部件的控制操作等。 ① 变量访问 NumCount EQU 0x40003000 ;定义变量NumCount LDR R0,=NumCount ;使用LDR伪指令装载NumCount的地址到R0 LDR R1,[R0] ;取出变量值 ADD R1,R1,#1 ;NumCount=NumCount+1 STR R1,[R0] ;保存变量 单数据交换指令 单数据交换指令是Load/Store指令的一种特例,它把一个内存单元中的内容与寄存器中的内容进行交换,交换指令是一个原子操作,也就是说,在连续的总线操作中读/写一个存储单元,在操作期间阻止其他任何指令对该存储单元的读/写。 SWP指令一般有两种形式: (1), SWP 字交换 tmp=mem32[Rn]; mem32[Rn] = Rm; Rd = tmp 指令的格式: SWP {<cond>} <Rd>, <Rm>, [<Rn>] SWP R1, R1, [R0] ;将R1的内容与R0指向的存储单元内容进行交换。 (2), SWPB 字节交换 状态寄存器传输指令 ARM指令集提供了两条指令,用于读写程序状态寄存器,MRS指令用于把CPSR或SPSR的值传送到一个寄存器中;MSR相反,把一个寄存器的内容传送到CPSR或SPSR中,这两条指令结合起来,可用于对CPSR和SPSR进行读/写操作。 MRS 把程序状态寄存器的值传送给一个通用寄存器, Rd=SPSR MSR 把通用寄存器的值传送给程序状态寄存器或把一个立即数传送给程序状态寄存器 (1)MRS指令 在ARM指令集中,只有MRS指令可以 将状态寄存器中的值读取到通用寄存器中。 格式: MRS {<cond>} Rd, CPSR/SPSR 其中,Rd为目标寄存器,Rd不允许为程序计数器(R15)。 (2) MSR指令 在ARM指令集中,只有MSR指令可以直接设置 状态寄存器的值 格式: MSR {<cond>} SPSR/CPSR , #immed Msr {<cond>} CPSR/SPSR , Rm 3,LDM和STM的配对规则 LDMFD--STMFD LDMED--STMED LDMFA--STMFA LDMEA--STMEA LDMIA--STMDB LDMIB--STMDA LDMDA--STMIB LDMDB--STMIA 指令代码如下: .global _start_start:
-
JVM基础篇(三)-JVM结构-运行时数据区之程序计数器-程序计数器概述