PC寄存器 存储器中存储的内容是()

程序计数器PC中存放的内容是
程序计数器PC中存放的内容是
指令地址 具体是指下一条要执行的指令的地址
我有更好的回答:
剩余:2000字
与《程序计数器PC中存放的内容是》相关的作业问题
用来存放下一条指令的地址的.当执行一条指令时,首先需要根据PC中存放的指令地址,将指令由内存取到指令寄存器中,此过程称为“取指令”.与此同时,PC中的地址或自动加1或由转移指针给出下一条指今的地址.此后经过分析指令,执行指令.完成第一条指令的执行,而后根据PC取出第二条指令的地址,如此循环,执行每一条指令!
PC:程序计数器,在程序的执行过程中,PC始终是指向下一条要执行的指令.
B,你是逻辑上的错误!指令在执行,PC就是存放正在执行的指令地址.指令执行完了,将要执行下一条指令的瞬间,PC加1,就成了下一条指令地址.马上执行这条指令,PC又变成当前指令地址.来来去去它都是当前指令地址.好比如,你今年10岁,在你生日的前一天晚上的11:59的最后一微秒的瞬间,你的年龄加一,到了下一秒.就是你生日的
程序计数器PC的工作过程,是受CPU控制的.复位时,PC = 0000H.复位结束后,CPU按照PC的内容,到ROM中去取指令,每取出一个字节,就把PC的内容加一.就这些.
PC (personal computer),个人计算机一词源自于1978年IBM的第一部桌上型计算机型号PC,在此之前有Apple II的个人用计算机.能独立运行、完成特定功能的个人计算机.个人计算机不需要共享其他计算机的处理、磁盘和打印机等资源也可以独立工作.今天,个人计算机一词则泛指所有的个人计算机、如桌上型计算
题目长了写不下,可以写在补充内容里
DB表示字节,DW表示字,‘A’表示大写的a的ASCII值,用十六进制表示就是41H,是一个字的内容,所以DAT单元存储41H,DAT+1存储00H
在8086上它不是通用寄存器,因为不能通过mov等普通指令来操作,只能通过跳转指令等操作.在ARM上不一样,它是可以通过普通的LDR指令来赋值(当然会导致程序跳转),所以可以归为通用寄存器.在arm中,PC寄存器的另外一个名称是r15,即15号寄存器.所以,在LDR pc,***等指令的机器码中,表示PC寄存器的比特代
,是单字节指令,因此执行后PC加1.34.累加器A中存放着一个其值小于等于127的8位无符号数,CY清“0”后执行RLC A指令,则A中数变为原来的 2 倍
Harry James Potter is the title character and the main protagonist of J. K. Rowling's Harry Potter fantasy series. The books cover seven years in the life of th
哈利波特6的内容(很全,就是不知道是真是假)第一章首先是麻瓜世界的部长的出现了,他正在为最近出现的几次大规模的伤害事件比如大桥毁坏等等而担忧焦急,然后在墙上的油画中传来了一个奇怪的声音,而这个声音就是魔法部长和他之间会面的信号,由此让他联想到了自己第一天上任的时候的景象,然后是他和福吉的见面,福吉被罢免,出现新上任的魔
知识,是一个人一生中最宝贵的东西之一,只要你愿意去探索 ,它就会无穷无尽;……
好词1.我完全不顾父愿,甚至违抗父命,也全然不听母亲的恳求和朋友们的劝阻.我的这种天性,似乎注定了我未来不幸的命运.2.我这个不孝之子,背弃父母,不尽天职,老天就这么快惩罚我了,真是天公地道.3.唉!人在恐惧中所作出的决定是多么荒唐可笑啊!凡是理智提供他们保护自己的种种办法,一旦恐惧心占了上风,他们就不知道如何使用这些
(1)有人说双喜带着大家偷豆,不是个好孩子,应该是个坏孩子头儿.你是如何看待的呢?请联系课文中的相关内容.说说你的看法.我不认为双喜是个坏孩子.这是孩子们天真、淳朴的表现.他们所谓的“偷豆”,是因为回来的时候肚子饿了,而且阿发因为自己家的罗汉豆大,便让大家摘自己家的.至于后来六一公公知道大家“偷”吃了他的罗汉豆,非但不
  就颔联与颈联的描写艺术作简要分析.(4分)  “郭门临渡头,村树连溪口”   远处,村口的城门矗立在河边渡头旁,村里的树木紧紧相连,一直延伸到小溪边.中国古代的城市大都设有人工开掘的护城河,高高的城墙就紧靠着护城河.但也有一些靠着江河的城市,因地制宜,以天然的江河为护城河,形成了“郭门临渡头”的情形.诗中这个临水的
他好像面对着大海,月光正从水天相接的地方升起来.微波粼粼的海面上,霎时间洒遍了银光.月亮越升越高,穿过一缕一缕轻纱似的微云.忽然,海面上刮起了大风,卷起了巨浪.被月光照得雪亮的浪花,一个连一个朝着岸边涌过来……
一文中,凡卡给爷爷写信的主要内容是:( 诉说自己的悲惨生活,乞求爷爷带自己回乡下 ).信中插叙的内容有:(乡村冬夜雪景 、和爷爷一起砍圣诞树 ).将虽然艰难但充满温情的乡下生活与(悲惨的学徒生活 )对比,目的是为了反衬(凡卡学徒生活的悲惨,和他的不幸,以及凡卡对爷爷的思念 ).
Harry Potter is a series of seven fantasy novels written by the British author J.K.Rowling.The books chronicle the adventures of the adolescent wizard Harry Pot问答题简答题参考答案:PC是16位程序计数器(Program Counter),它不属于特殊功能寄存器范畴,程序员不以像访问特殊功能寄存器那样来访问PC。PC是专门......
你可能喜欢
问答题参考答案:8051单片机内部有21个特殊功能寄存器,在物理上是分散在片内各功能部件中,在数学上把它们组织在内部数据存储器地址空间80H~FFH......问答题参考答案:8051内部128B的数据RAM区,包括有工作寄存器组区、可直接位寻址区和数据缓冲区。各区域的特性如下:(1)00H~1FH为工作寄存器组......问答题参考答案:8051存储器包括程序存储器和数据存储器,从逻辑结构上看,可以分为三个不同的空间:(1)64KB的程序存储器地址空间:0000H~FFFFH......问答题参考答案:8051单片机是个完整的单片微型计算机。芯片内部包括下列硬件资源:(1)8位CPU;(2)4KB的片内程序存储器ROM。可寻址64KB程序存......单项选择题
C.T1,串行接口
版权所有?考试资料网(ppkao.com)All Rights Reserved近日,在研究一些开源native层hook方案的实现方式,并据此对ARM汇编层中容易出问题的一些地方做了整理,以便后来人能有从中有所收获并应用于现实问题中。当然,文中许多介绍参考了许多零散的文章,本文重点工作在于对相关概念的整理收集,并按相对合理顺序引出后文中对hook技术中的一些难点的解读。& && &&
& && &&&Android平台大多采用了ARM架构的CPU,而ARM属RISC,与X86架构的处理器有不同的特征,本文讲介绍ARM中不容易理解的PC寄存器各种问题,包括ARM流水线、PC寄存器指向问题、ARM和Thumb指令的区分及相关概念在native层hook中的应用问题。
1.ARM寄存器介绍
& && &&&ARM微处理器共有37个32位寄存器,其中31个为通用寄存器,6个为状态寄存器。但是这些寄存器不能被同时访问,具体哪些寄存器是可以访问的,取决ARM处理器的工作状态及具体的运行模式。但在任何时候,通用寄存器R14~R0、程序计数器PC、一个状态寄存器都是可访问的。
& && &&&简言之,在用户模式下ARM可见的寄存器有16个32位的寄存器(R0到R15)和一个当前程序状态寄存器CPSR,其中R15是程序计数器PC,R14用于存储子程序的返回地址LR,R13用于存储堆栈栈顶SP。
& && &&&本文我们将着重介绍一下R15寄存器,即PC寄存器。理论上,PC寄存器应指向即将执行的下一条指令的地址,然而在实际应用中却发现PC寄存器总不是如此。经过翻看资料发现,该问题是由于ARM存在的指令流水线导致的。
2.ARM流水线介绍& && &&&流水线技术通过多个功能部件并行工作来缩短程序执行时间,提高处理器核的效率和吞吐率,从而成为微处理器设计中最为重要的技术之一。也就是说,通过划分指令执行过程中的不同阶段,并通过并行执行,从而提高指令的执行效率。ARM7处理器采用了三级流水线结构,包括取指(fetch)、译码(decode)、执行(execute)三级。&&
3.PC寄存器的指向问题& && && && &如上图所示,在执行add r0, r1, #5指令时,第二条指令正在译码阶段,而第三条指令正在取指阶段。在执行第一条指令时,PC寄存器应指向第三条指令。也即,当处理器为三级流水线结构时,PC寄存器总是指向随后的第三条指令。&
当处理器处于ARM状态时,每条ARM指令为4个字节,所以PC寄存器的值为当前指令地址 + 8字节
当处理器处于Thumb状态时,每条Thumb指令为2字节,所以PC寄存器的值为当前指令地址 + 4字节
& & 此外,在ARM9中,采用了五级流水线结构,是在ARM7的三级流水线结构后面添加了两个新的过程。因此,指令的执行过程和取指过程还是相隔一个译码过程,因而PC还是指向当前指令随后的第三条指令。&
& & 另外,关于PC寄存器需要注意的一点是:当使用指令STR或STM对R15进行保存时,保存的可能是当前指令地址加8或当前指令地址加12。具体是加8还是加12,取决于具体的处理器设计。但是,同一个芯片只能是其中一种的方案,即只能是加8或加12中的一种。
& & 可以通过如下的代码确定处理器采用的那种方式:&
SUB R1,PC, #4& & ;R1中存放STR指令地址&
STR PC,[R0]& && &;用STR指令将PC保存到R0指向的地址单元中,PC=STR指令地址+偏移量(偏移量为8或者12)。&
LDR R0,[R0]& & ;读取STR指令地址+偏移量的值&
SUB R0,R0,R1& & ; STR指令地址+偏移量的值减去STR指令的地址,得到偏移量值(8或者12)。&
4. ARM/Thumb指令的区分& && &&&众所周知,ARM体系结构分为ARM状态和Thumb状态及Thumb-2状态。在ARM状态时执行32位长度的字对齐的ARM指令,Thumb状态时执行16位长度的半字对齐的Thumb指令。
Thumb指令集与 ARM 指令的区别一般有如下几点:
& & 程序相对转移,特别是条件跳转与 ARM 代码下的跳转相比,在范围上有更多的限制,转向子程序是无条件的转移.
数据处理指令
& & 数据处理指令是对通用寄存器进行操作,在大多数情况下,操作的结果须放入其中一个操作数寄存器中,而不是第 3 个寄存器中.数据处理操作比 ARM 状态的更少,访问寄存器 R8~R15 受到一定限制.除 MOV 和 ADD 指令访问器 R8~R15 外,其它数据处理指令总是更新 CPSR 中的 ALU 状态标志.访问寄存器 R8~R15 的 Thumb 数据处理指令不能更新 CPSR 中的 ALU 状态标志.
单寄存器加载和存储指令
在 Thumb 状态下,单寄存器加载和存储指令只能访问寄存器 R0~R7
批量寄存器加载和存储指令
& & LDM 和 STM 指令可以将任何范围为 R0~R7 的寄存器子集加载或存储. PUSH 和 POP 指令使用堆栈指令 R13 作为基址实现满递减堆栈.除 R0~R7 外,PUSH 指令还可以存储链接寄存器 R14,并且 POP 指令可以加载程序指令PC
& &&&而程序在执行过程中,是如何区分ARM状态和Thumb状态的呢?在逆向分析过程中,经常会看到许多函数调用过程为形如BX sub_84C0 + 1,即函数地址为奇数。在ARM运行过程中,函数调用的地址最后一位为1时,表示目标函数为Thumb指令;否则为ARM指令。然而,不管是ARM和Thumb状态指令,均是偶数字节对齐的,即函数地址最后一位肯定为0。因此,可以用最后一位判断目标函数是否为Thumb和ARM状态。
& && &&&综上,程序状态切换可以用如下方式实现:
从ARM切换到Thumb:
& && &&&LDR R0, =label + 1
& && &&&BX R0
从Thumb切换到ARM:
& && &&&LDR R0, = label
& && &&&BX R0
& & 上文中,label为符号的地址,因为字节对齐缘故,最后一位肯定为0。
5.native层hook技术解析& && &&&以上 问题均是我在分析开源hook框架adbi源码时遇到的问题的解答,下面我将介绍一下上述几个问题在hook中的应用。
& && &&&在adbi源文件中,hijack.c文件中的sc数组用于存储在对目标函数前几个字节的指令修改过程中的相关指令和寄存器值。
& && &&&第一条指令为ldr r0, [pc, #64],即将pc + 64位置处的内存的4个字节读到r0寄存器中。经过上面几个章节的介绍,且此处看出指令均为4个字节即ARM指令,可知读取的位置为当前位置 + 8 + 64 位置处的内容,即sc[18]处的内容,也即addr of libname的内容,即将函数调用时第一个参数R0设置为动态库的字符串名。
& && &&&第二条指令将r1寄存器,即函数的第二个参数设置为0。
& && &&&第三条指令将pc的值赋值给lr寄存器,即将随后函数调用后的返回地址设置为559行的那条指令,即第五条指令。
& && &&&第四条指令将pc + 56位置处存储的值赋值给pc寄存器,即当前位置 + 8 + 56位置处的值,也即sc[16]处的值,即被hook的dlopen函数的地址。
& && &&&随后函数调转到目标函数执行,并在返回后执行559行的执行,从此开始恢复寄存器环境。也即通过这种方式完成了对目标函数的hook劫持过程。
& && &&&在hook.c文件中,实现了对目标函数的查找及指令替换功能,详情如下图所示。图中,通过对find_name函数的调用,得到了目标so库中的函数funcname的地址并存储于addr中。在代码编译过程中,编译为Thumb指令的函数,通过函数名得到的目标函数地址最后一位为1,用于表示目标函数为Thumb指令集。在adbi代码中,即根据该方法判断需要hook的目标函数是Thumb指令集还是ARM指令集。ARM指令集由于是4字节对齐的,因此最后2位总是为0,据此判断是否是ARM指令。根据不同的指令集实现不同的指令替换,并完成hook功能。&
& && &&&以上即是我在研究adbi源码过程中碰到的需要深入了解的一些基本概念及其具体应用,了解这些能对hook的实现原理能有较为深刻的理解,并据此编写自己的简易的hook方案。
6.总结& && &&&在ARM处理器架构中,PC寄存器通常是指向当前指令后的第三条指令地址,即在ARM指令是+8,Thumb指令时+4。&
& && &&&ARM/Thumb状态切换是根据目标函数地址最后一位是否为0来进行判断,并用BX指令实现。
有问题大家可以留言哦,也欢迎大家到春秋论坛中来耍一耍&&
阅读(...) 评论()寄存器概念整理_百度文库
您的浏览器Javascript被禁用,需开启后体验完整功能,
赠送免券下载特权
10W篇文档免费专享
部分付费文档8折起
每天抽奖多种福利
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
寄存器概念整理
&&stm32寄存器操作
阅读已结束,下载本文需要
想免费下载本文?
定制HR最喜欢的简历
下载文档到电脑,同时保存到云知识,更方便管理
加入VIP
还剩4页未读,
定制HR最喜欢的简历
你可能喜欢什么寄存器用于存储pc和链接寄存器
什么寄存器用于存储pc和链接寄存器
09-10-08 &匿名提问
运算器arithmetic unit计算机中执行各种算术和逻辑运算操作的部件。运算器的基本操作包括加、减、乘、除四则运算,与、或、非、异或等逻辑操作,以及移位、比较和传送等操作,亦称算术逻辑部件(ALU)。计算机运行时,运算器的操作和操作种类由控制器决定。运算器处理的数据来自存储器;处理后的结果数据通常送回存储器,或暂时寄存在运算器中。数据 运算器的处理对象是数据,所以数据长度和计算机数据表示方法,对运算器的性能影响极大。70年代微处理器常以1个、4个、8个、16个二进制位作为处理数据的基本单位。大多数通用计算机则以16、32、64位作为运算器处理数据的长度。能对一个数据的所有位同时进行处理的运算器称为并行运算器。如果一次只处理一位,则称为串行运算器。有的运算器一次可处理几位 (通常为6或8位),一个完整的数据分成若干段进行计算,称为串?并行运算器。运算器往往只处理一种长度的数据。有的也能处理几种不同长度的数据,如半字长运算、双倍字长运算、四倍字长运算等。有的数据长度可以在运算过程中指定,称为变字长运算。按照数据的不同表示方法,可以有二进制运算器、十进制运算器、十六进制运算器、定点整数运算器、定点小数运算器、浮点数运算器等。按照数据的性质,有地址运算器和字符运算器等。操作 运算器能执行多少种操作和操作速度,标志着运算器能力的强弱,甚至标志着计算机本身的能力。运算器最基本的操作是加法。一个数与零相加,等于简单地传送这个数。将一个数的代码求补,与另一个数相加,相当于从后一个数中减去前一个数。将两个数相减可以比较它们的大小。左右移位是运算器的基本操作。在有符号的数中,符号不动而只移数据位,称为算术移位。若数据连同符号的所有位一齐移动,称为逻辑移位。若将数据的最高位与最低位链接进行逻辑移位,称为循环移位。运算器的逻辑操作可将两个数据按位进行与、或、异或,以及将一个数据的各位求非。有的运算器还能进行二值代码的16种逻辑操作。乘、除法操作较为复杂。很多计算机的运算器能直接完成这些操作。乘法操作是以加法操作为基础的,由乘数的一位或几位译码控制逐次产生部分积,部分积相加得乘积。除法则又常以乘法为基础,即选定若干因子乘以除数,使它近似为1,这些因子乘被除数则得商。没有执行乘法、除法硬件的计算机可用程序实现乘、除,但速度慢得多。有的运算器还能执行在一批数中寻求最大数,对一批数据连续执行同一种操作,求平方根等复杂操作。运算方法 实现运算器的操作,特别是四则运算,必须选择合理的运算方法。它直接影响运算器的性能,也关系到运算器的结构和成本。另外,在进行数值计算时,结果的有效数位可能较长,必须截取一定的有效数位,由此而产生最低有效数位的舍入问题。选用的舍入规则也影响到计算结果的精确度。结构 运算器包括寄存器、执行部件和控制电路3个部分。在典型的运算器中有3个寄存器:接收并保存一个操作数的接收寄存器;保存另一个操作数和运算结果的累加寄存器;在进行乘、除运算时保存乘数或商数的乘商寄存器。执行部件包括一个加法器和各种类型的输入输出门电路。控制电路按照一定的时间顺序发出不同的控制信号,使数据经过相应的门电路进入寄存器或加法器,完成规定的操作。为了减少对存储器的访问,很多计算机的运算器设有较多的寄存器,存放中间计算结果,以便在后面的运算中直接用作操作数。为了提高运算速度,某些大型计算机有多个运算器。它们可以是不同类型的运算器,如定点加法器、浮点加法器、乘法器等,也可以是相同类型的运算器。运算器由算术逻辑单元(ALU)、累加寄存器、数据缓冲寄存器和状态条件寄存器组成,它是数据加工处理部件。相对控制器而言,运算器接受控制器的命令而进行动作 ,即运算器所进行的全部操作都是由控制器发出的控制信号来指挥的所以它是执行部件。 主要功能:执行所有的算术运算;? 执行所有的逻辑运算,并进行逻辑测试,如零值测试或两个值的比较。 运算器:是进行运算的部件,主要功能是算术运算和逻辑运算。
请登录后再发表评论!
、什么是Java虚拟机Java虚拟机是一个想象中的机器,在实际的计算机上通过软件模拟来实现。Java虚拟机有自己想象中的硬件,如处理器、堆栈、寄存器等,还具有相应的指令系统。1.为什么要使用Java虚拟机Java语言的一个非常重要的特点就是与平台的无关性。而使用Java虚拟机是实现这一特点的关键。一般的高级语言如果要在不同的平台上运行,至少需要编译成不同的目标代码。而引入Java语言虚拟机后,Java语言在不同平台上运行时不需要重新编译。Java语言使用模式Java虚拟机屏蔽了与具体平台相关的信息,使得Java语言编译程序只需生成在Java虚拟机上运行的目标代码(字节码),就可以在多种平台上不加修改地运行。Java虚拟机在执行字节码时,把字节码解释成具体平台上的机器指令执行。2.谁需要了解Java虚拟机Java虚拟机是Java语言底层实现的基础,对Java语言感兴趣的人都应对Java虚拟机有个大概的了解。这有助于理解Java语言的一些性质,也有助于使用Java语言。对于要在特定平台上实现Java虚拟机的软件人员,Java语言的编译器作者以及要用硬件芯片实现Java虚拟机的人来说,则必须深刻理解Java虚拟机的规范。另外,如果你想扩展Java语言,或是把其它语言编译成Java语言的字节码,你也需要深入地了解Java虚拟机。3.Java虚拟机支持的数据类型Java虚拟机支持Java语言的基本数据类型如下:byte://1字节有符号整数的补码 short://2字节有符号整数的补码 int://4字节有符号整数的补码 long://8字节有符号整数的补码 float://4字节IEEE754单精度浮点数 double://8字节IEEE754双精度浮点数 char://2字节无符号Unicode字符几乎所有的Java类型检查都是在编译时完成的。上面列出的原始数据类型的数据在Java执行时不需要用硬件标记。操作这些原始数据类型数据的字节码(指令)本身就已经指出了操作数的数据类型,例如iadd、ladd、fadd和dadd指令都是把两个数相加,其操作数类型别是int、long、float和double。虚拟机没有给boolean(布尔)类型设置单独的指令。boolean型的数据是由integer指令,包括integer返回来处理的。boolean型的数组则是用byte数组来处理的。虚拟机使用IEEE754格式的浮点数。不支持IEEE格式的较旧的计算机,在运行Java数值计算程序时,可能会非常慢。虚拟机支持的其它数据类型包括: object//对一个Javaobject(对象)的4字节引用 returnAddress//4字节,用于jsr/ret/jsr-w/ret-w指令 注:Java数组被当作object处理。虚拟机的规范对于object内部的结构没有任何特殊的要求。在Sun公司的实现中,对object的引用是一个句柄,其中包含一对指针:一个指针指向该object的方法表,另一个指向该object的数据。用Java虚拟机的字节码表示的程序应该遵守类型规定。Java虚拟机的实现应拒绝执行违反了类型规定的字节码程序。Java虚拟机由于字节码定义的限制似乎只能运行于32位地址空间的机器上。但是可以创建一个Java虚拟机,它自动地把字节码转换成64位的形式。从Java虚拟机支持的数据类型可以看出,Java对数据类型的内部格式进行了严格规定,这样使得各种Java虚拟机的实现对数据的解释是相同的,从而保证了Java的与平台无关性和可 移植性。二、Java虚拟机体系结构Java虚拟机由五个部分组成:一组指令集、一组寄存器、一个栈、一个无用单元收集堆(Garbage-collected-heap)、一个方法区域。这五部分是Java虚拟机的逻辑成份,不依赖任何实现技术或组织方式,但它们的功能必须在真实机器上以某种方式实现。1.Java指令集Java虚拟机支持大约248个字节码。每个字节码执行一种基本的CPU运算,例如,把一个整数加到寄存器,子程序转移等。Java指令集相当于Java程序的汇编语言。 Java指令集中的指令包含一个单字节的操作符,用于指定要执行的操作,还有0个或多个操作数,提供操作所需的参数或数据。许多指令没有操作数,仅由一个单字节的操作符构成。虚拟机的内层循环的执行过程如下: do{ 取一个操作符字节; 根据操作符的值执行一个动作; }while(程序未结束)由于指令系统的简单性,使得虚拟机执行的过程十分简单,从而有利于提高执行的效率。指令中操作数的数量和大小是由操作符决定的。如果操作数比一个字节大,那么它存储的顺序是高位字节优先。例如,一个16位的参数存放时占用两个字节,其值为:第一个字节*256+第二个字节字节码指令流一般只是字节对齐的。指令tableswitch和lookup是例外,在这两条指令内部要求强制的4字节边界对齐。2.寄存器Java虚拟机的寄存器用于保存机器的运行状态,与微处理器中的某些专用寄存器类似。Java虚拟机的寄存器有四种: pc:Java程序计数器。 optop:指向操作数栈顶端的指针。 frame:指向当前执行方法的执行环境的指针。 vars:指向当前执行方法的局部变量区第一个变量的指针。Java虚拟机Java虚拟机是栈式的,它不定义或使用寄存器来传递或接受参数,其目的是为了保证指令集的简洁性和实现时的高效性(特别是对于寄存器数目不多的处理器)。 所有寄存器都是32位的。3.栈Java虚拟机的栈有三个区域:局部变量区、运行环境区、操作数区。(1)局部变量区 每个Java方法使用一个固定大小的局部变量集。它们按照与vars寄存器的字偏移量来寻址。局部变量都是32位的。长整数和双精度浮点数占据了两个局部变量的空间,却按照第一个局部变量的索引来寻址。(例如,一个具有索引n的局部变量,如果是一个双精度浮点数,那么它实际占据了索引n和n+1所代表的存储空间。)虚拟机规范并不要求在局部变量中的64位的值是64位对齐的。虚拟机提供了把局部变量中的值装载到操作数栈的指令,也提供了把操作数栈中的值写入局部变量的指令。(2)运行环境区 在运行环境中包含的信息用于动态链接,正常的方法返回以及异常传播。·动态链接 运行环境包括对指向当前类和当前方法的解释器符号表的指针,用于支持方法代码的动态链接。方法的class文件代码在引用要调用的方法和要访问的变量时使用符号。动态链接把符号形式的方法调用翻译成实际方法调用,装载必要的类以解释还没有定义的符号,并把变量访问翻译成与这些变量运行时的存储结构相应的偏移地址。动态链接方法和变量使得方法中使用的其它类的变化不会影响到本程序的代码。·正常的方法返回如果当前方法正常地结束了,在执行了一条具有正确类型的返回指令时,调用的方法会得到一个返回值。执行环境在正常返回的情况下用于恢复调用者的寄存器,并把调用者的程序计数器增加一个恰当的数值,以跳过已执行过的方法调用指令,然后在调用者的执行环境中继续执行下去。·异常和错误传播异常情况在Java中被称作Error(错误)或Exception(异常),是Throwable类的子类,在程序中的原因是:①动态链接错,如无法找到所需的class文件。②运行时错,如对一个空指针的引用·程序使用了throw语句。当异常发生时,Java虚拟机采取如下措施:·检查与当前方法相联系的catch子句表。每个catch子句包含其有效指令范围,能够处理的异常类型,以及处理异常的代码块地址。·与异常相匹配的catch子句应该符合下面的条件:造成异常的指令在其指令范围之内,发生的异常类型是其能处理的异常类型的子类型。如果找到了匹配的catch子句,那么系统转移到指定的异常处理块处执行;如果没有找到异常处理块,重复寻找匹配的catch子句的过程,直到当前方法的所有嵌套的catch子句都被检查过。·由于虚拟机从第一个匹配的catch子句处继续执行,所以catch子句表中的顺序是很重要的。因为Java代码是结构化的,因此总可以把某个方法的所有的异常处理器都按序排列到一个表中,对任意可能的程序计数器的值,都可以用线性的顺序找到合适的异常处理块,以处理在该程序计数器值下发生的异常情况。·如果找不到匹配的catch子句,那么当前方法得到一个&未截获异常&的结果并返回到当前方法的调用者,好像异常刚刚在其调用者中发生一样。如果在调用者中仍然没有找到相应的异常处理块,那么这种错误传播将被继续下去。如果错误被传播到最顶层,那么系统将调用一个缺省的异常处理块。 (3)操作数栈区 机器指令只从操作数栈中取操作数,对它们进行操作,并把结果返回到栈中。选择栈结构的原因是:在只有少量寄存器或非通用寄存器的机器(如Intel486)上,也能够高效地模拟虚拟机的行为。操作数栈是32位的。它用于给方法传递参数,并从方法接收结果,也用于支持操作的参数,并保存操作的结果。例如,iadd指令将两个整数相加。相加的两个整数应该是操作数栈顶的两个字。这两个字是由先前的指令压进堆栈的。这两个整数将从堆栈弹出、相加,并把结果压回到操作数栈中。每个原始数据类型都有专门的指令对它们进行必须的操作。每个操作数在栈中需要一个存储位置,除了long和double型,它们需要两个位置。操作数只能被适用于其类型的操作符所操作。例如,压入两个int类型的数,如果把它们当作是一个long类型的数则是非法的。在Sun的虚拟机实现中,这个限制由字节码验证器强制实行。但是,有少数操作(操作符dupe和swap),用于对运行时数据区进行操作时是不考虑类型的。4.无用单元收集堆Java的堆是一个运行时数据区,类的实例(对象)从中分配空间。Java语言具有无用单元收集能力:它不给程序员显式释放对象的能力。Java不规定具体使用的无用单元收集算法,可以根据系统的需求使用各种各样的算法。5.方法区方法区与传统语言中的编译后代码或是Unix进程中的正文段类似。它保存方法代码(编译后的java代码)和符号表。在当前的Java实现中,方法代码不包括在无用单元收集堆中,但计划在将来的版本中实现。每个类文件包含了一个Java类或一个Java界面的编译后的代码。可以说类文件是Java语言的执行代码文件。为了保证类文件的平台无关性,Java虚拟机规范中对类文件的格式也作了详细的说明。其具体细节请参考Sun公司的Java虚拟机规范。
Java虚拟机一、什么是Java虚拟机Java虚拟机是一个想象中的机器,在实际的计算机上通过软件模拟来实现。Java虚拟机有自己想象中的硬件,如处理器、堆栈、寄存器等,还具有相应的指令系统。1.为什么要使用Java虚拟机Java语言的一个非常重要的特点就是与平台的无关性。而使用Java虚拟机是实现这一特点的关键。一般的高级语言如果要在不同的平台上运行,至少需要编译成不同的目标代码。而引入Java语言虚拟机后,Java语言在不同平台上运行时不需要重新编译。Java语言使用模式Java虚拟机屏蔽了与具体平台相关的信息,使得Java语言编译程序只需生成在Java虚拟机上运行的目标代码(字节码),就可以在多种平台上不加修改地运行。Java虚拟机在执行字节码时,把字节码解释成具体平台上的机器指令执行。2.谁需要了解Java虚拟机Java虚拟机是Java语言底层实现的基础,对Java语言感兴趣的人都应对Java虚拟机有个大概的了解。这有助于理解Java语言的一些性质,也有助于使用Java语言。对于要在特定平台上实现Java虚拟机的软件人员,Java语言的编译器作者以及要用硬件芯片实现Java虚拟机的人来说,则必须深刻理解Java虚拟机的规范。另外,如果你想扩展Java语言,或是把其它语言编译成Java语言的字节码,你也需要深入地了解Java虚拟机。3.Java虚拟机支持的数据类型Java虚拟机支持Java语言的基本数据类型如下:byte://1字节有符号整数的补码 short://2字节有符号整数的补码 int://4字节有符号整数的补码 long://8字节有符号整数的补码 float://4字节IEEE754单精度浮点数 double://8字节IEEE754双精度浮点数 char://2字节无符号Unicode字符几乎所有的Java类型检查都是在编译时完成的。上面列出的原始数据类型的数据在Java执行时不需要用硬件标记。操作这些原始数据类型数据的字节码(指令)本身就已经指出了操作数的数据类型,例如iadd、ladd、fadd和dadd指令都是把两个数相加,其操作数类型别是int、long、float和double。虚拟机没有给boolean(布尔)类型设置单独的指令。boolean型的数据是由integer指令,包括integer返回来处理的。boolean型的数组则是用byte数组来处理的。虚拟机使用IEEE754格式的浮点数。不支持IEEE格式的较旧的计算机,在运行Java数值计算程序时,可能会非常慢。虚拟机支持的其它数据类型包括: object//对一个Javaobject(对象)的4字节引用 returnAddress//4字节,用于jsr/ret/jsr-w/ret-w指令 注:Java数组被当作object处理。虚拟机的规范对于object内部的结构没有任何特殊的要求。在Sun公司的实现中,对object的引用是一个句柄,其中包含一对指针:一个指针指向该object的方法表,另一个指向该object的数据。用Java虚拟机的字节码表示的程序应该遵守类型规定。Java虚拟机的实现应拒绝执行违反了类型规定的字节码程序。Java虚拟机由于字节码定义的限制似乎只能运行于32位地址空间的机器上。但是可以创建一个Java虚拟机,它自动地把字节码转换成64位的形式。从Java虚拟机支持的数据类型可以看出,Java对数据类型的内部格式进行了严格规定,这样使得各种Java虚拟机的实现对数据的解释是相同的,从而保证了Java的与平台无关性和可 移植性。二、Java虚拟机体系结构Java虚拟机由五个部分组成:一组指令集、一组寄存器、一个栈、一个无用单元收集堆(Garbage-collected-heap)、一个方法区域。这五部分是Java虚拟机的逻辑成份,不依赖任何实现技术或组织方式,但它们的功能必须在真实机器上以某种方式实现。1.Java指令集Java虚拟机支持大约248个字节码。每个字节码执行一种基本的CPU运算,例如,把一个整数加到寄存器,子程序转移等。Java指令集相当于Java程序的汇编语言。 Java指令集中的指令包含一个单字节的操作符,用于指定要执行的操作,还有0个或多个操作数,提供操作所需的参数或数据。许多指令没有操作数,仅由一个单字节的操作符构成。虚拟机的内层循环的执行过程如下: do{ 取一个操作符字节; 根据操作符的值执行一个动作; }while(程序未结束)由于指令系统的简单性,使得虚拟机执行的过程十分简单,从而有利于提高执行的效率。指令中操作数的数量和大小是由操作符决定的。如果操作数比一个字节大,那么它存储的顺序是高位字节优先。例如,一个16位的参数存放时占用两个字节,其值为:第一个字节*256+第二个字节字节码指令流一般只是字节对齐的。指令tableswitch和lookup是例外,在这两条指令内部要求强制的4字节边界对齐。2.寄存器Java虚拟机的寄存器用于保存机器的运行状态,与微处理器中的某些专用寄存器类似。Java虚拟机的寄存器有四种: pc:Java程序计数器。 optop:指向操作数栈顶端的指针。 frame:指向当前执行方法的执行环境的指针。 vars:指向当前执行方法的局部变量区第一个变量的指针。Java虚拟机Java虚拟机是栈式的,它不定义或使用寄存器来传递或接受参数,其目的是为了保证指令集的简洁性和实现时的高效性(特别是对于寄存器数目不多的处理器)。 所有寄存器都是32位的。3.栈Java虚拟机的栈有三个区域:局部变量区、运行环境区、操作数区。(1)局部变量区 每个Java方法使用一个固定大小的局部变量集。它们按照与vars寄存器的字偏移量来寻址。局部变量都是32位的。长整数和双精度浮点数占据了两个局部变量的空间,却按照第一个局部变量的索引来寻址。(例如,一个具有索引n的局部变量,如果是一个双精度浮点数,那么它实际占据了索引n和n+1所代表的存储空间。)虚拟机规范并不要求在局部变量中的64位的值是64位对齐的。虚拟机提供了把局部变量中的值装载到操作数栈的指令,也提供了把操作数栈中的值写入局部变量的指令。(2)运行环境区 在运行环境中包含的信息用于动态链接,正常的方法返回以及异常传播。·动态链接 运行环境包括对指向当前类和当前方法的解释器符号表的指针,用于支持方法代码的动态链接。方法的class文件代码在引用要调用的方法和要访问的变量时使用符号。动态链接把符号形式的方法调用翻译成实际方法调用,装载必要的类以解释还没有定义的符号,并把变量访问翻译成与这些变量运行时的存储结构相应的偏移地址。动态链接方法和变量使得方法中使用的其它类的变化不会影响到本程序的代码。·正常的方法返回如果当前方法正常地结束了,在执行了一条具有正确类型的返回指令时,调用的方法会得到一个返回值。执行环境在正常返回的情况下用于恢复调用者的寄存器,并把调用者的程序计数器增加一个恰当的数值,以跳过已执行过的方法调用指令,然后在调用者的执行环境中继续执行下去。·异常和错误传播异常情况在Java中被称作Error(错误)或Exception(异常),是Throwable类的子类,在程序中的原因是:①动态链接错,如无法找到所需的class文件。②运行时错,如对一个空指针的引用·程序使用了throw语句。当异常发生时,Java虚拟机采取如下措施:·检查与当前方法相联系的catch子句表。每个catch子句包含其有效指令范围,能够处理的异常类型,以及处理异常的代码块地址。·与异常相匹配的catch子句应该符合下面的条件:造成异常的指令在其指令范围之内,发生的异常类型是其能处理的异常类型的子类型。如果找到了匹配的catch子句,那么系统转移到指定的异常处理块处执行;如果没有找到异常处理块,重复寻找匹配的catch子句的过程,直到当前方法的所有嵌套的catch子句都被检查过。·由于虚拟机从第一个匹配的catch子句处继续执行,所以catch子句表中的顺序是很重要的。因为Java代码是结构化的,因此总可以把某个方法的所有的异常处理器都按序排列到一个表中,对任意可能的程序计数器的值,都可以用线性的顺序找到合适的异常处理块,以处理在该程序计数器值下发生的异常情况。·如果找不到匹配的catch子句,那么当前方法得到一个&未截获异常&的结果并返回到当前方法的调用者,好像异常刚刚在其调用者中发生一样。如果在调用者中仍然没有找到相应的异常处理块,那么这种错误传播将被继续下去。如果错误被传播到最顶层,那么系统将调用一个缺省的异常处理块。 (3)操作数栈区 机器指令只从操作数栈中取操作数,对它们进行操作,并把结果返回到栈中。选择栈结构的原因是:在只有少量寄存器或非通用寄存器的机器(如Intel486)上,也能够高效地模拟虚拟机的行为。操作数栈是32位的。它用于给方法传递参数,并从方法接收结果,也用于支持操作的参数,并保存操作的结果。例如,iadd指令将两个整数相加。相加的两个整数应该是操作数栈顶的两个字。这两个字是由先前的指令压进堆栈的。这两个整数将从堆栈弹出、相加,并把结果压回到操作数栈中。每个原始数据类型都有专门的指令对它们进行必须的操作。每个操作数在栈中需要一个存储位置,除了long和double型,它们需要两个位置。操作数只能被适用于其类型的操作符所操作。例如,压入两个int类型的数,如果把它们当作是一个long类型的数则是非法的。在Sun的虚拟机实现中,这个限制由字节码验证器强制实行。但是,有少数操作(操作符dupe和swap),用于对运行时数据区进行操作时是不考虑类型的。4.无用单元收集堆Java的堆是一个运行时数据区,类的实例(对象)从中分配空间。Java语言具有无用单元收集能力:它不给程序员显式释放对象的能力。Java不规定具体使用的无用单元收集算法,可以根据系统的需求使用各种各样的算法。5.方法区方法区与传统语言中的编译后代码或是Unix进程中的正文段类似。它保存方法代码(编译后的java代码)和符号表。在当前的Java实现中,方法代码不包括在无用单元收集堆中,但计划在将来的版本中实现。每个类文件包含了一个Java类或一个Java界面的编译后的代码。可以说类文件是Java语言的执行代码文件。为了保证类文件的平台无关性,Java虚拟机规范中对类文件的格式也作了详细的说明。其具体细节请参考Sun公司的Java虚拟机规范。
请登录后再发表评论!

我要回帖

更多关于 寄存器和存储器的区别 的文章

 

随机推荐