操作数

深入理解JVM:虚拟机字节码执行引擎

可紊 提交于 2020-02-02 00:40:25
一、运行时栈结构 栈帧 是用于支持虚拟机进行方法调用和方法执行的数据结构。 栈帧 包括: 局部变量表、操作数栈、动态连接、方法的返回地址 和一些额外的附加信息。 执行引擎运行的所有字节码指令只针对当前栈帧进行操作。需要注意的是一个栈中能容纳的栈帧是受限,过深的方法调用可能会导致StackOverFlowError,当然,我们可以认为设置栈的大小。其模型示意图大体如下: 执行引擎的所有字节码指令都只针对当前栈帧进行操作。 1、局部变量表 是变量值的存储空间,由方法参数和方法内部定义的局部变量组成,其容量用Slot 1 作为最小单位。 slot可以存放32位以内的数据类型。slot的长度可以随处理器、操作系统或虚拟机不同而发生改变。 局部变量表 的大小在编译时就可以确定,Code中的max_local。 局部变量表 不存在系统初始化的过程,这意味着一旦定义了局部变量则必须人为的初始化,否则无法使用。 JVM通过索引定位方式使用 局部变量表 。 在方法执行时,如果是实例方法,那么局部变量表的第0位索引的slot默认是用于传递方法所属类实例的引用(也就是this)。 2、操作数栈 操作数栈 的最大深度也在编译的时候写入到Code属性的max_stacks数据项中。 另外我们说Java虚拟机的解释引擎是基于栈的执行引擎,其中的栈指的就是 操作数栈 。 操作数栈

关于汇编语言操作数、操作符、操作码例子和定义详解

回眸只為那壹抹淺笑 提交于 2020-02-02 00:25:10
操作数 定义:操作数是运算符作用于的实体,是表达式中的一个组成部分,它规定了指令中进行数字运算的量 。表达式是操作数与操作符的组合。操作数指出指令执行的操作所需要数据的来源。操作数是汇编语言指令的一个字段。 例如:Mov AX 5678H 指令 Mov为操作符,而它后面的(AX 5678H)为操作数 一条指令均包含操作符和操作数。例如:在比较指令中操作符指定计算机做比较操作,操作数则指定进行比较的两个数值。 操作数是指令执行的参与者,也就是各种操作的对象.与之有关的是操作码,所谓操作码是说明计算机要执行哪种,如传送,运算,移位,跳转等操作,它是指令中不可缺少的组成部分。 在应用指令中,内容不随指令执行而变化的操作数为源操作数,内容随执行指令而改变的操作数为目标操作数。大多数情况下,操作数字段可有一个或者多个操作数。只有一个操作数的指令称为单操作数指令,有两个操作数的指令称为双操作数指令。双操作数又称为源操作数(source)和目的操作数(destination) 如:MOV AH,06H 操作符(MOV) 目的操作数(AH),源操作数(06H) 操作符 定义:指令系统的每一条指令都有一个操作符,它表示该指令应进行什么性质的操作。 优先级 每个操作符都有优先级。 结合性 每个操作符都有结合性。操作符的结合性定义了操作符对操作数执行操作的顺序,例如

Python-05-编码规范 PEP8

巧了我就是萌 提交于 2020-01-31 21:07:27
  这篇文档说明了Python主要发行版中标准库代码所遵守的规范。很多项目都有自己的一套风格指南。若和本指南有任何冲突,应该优先考虑其项目相关的那套指南。 文章目录 代码布局(Code Lay-Out) 缩进(Indentation) 每行最大长度(Maximum Line Length) 二元运算符之前还是之后换行?(Should a line break before or after a binary operator?) 空行(Blank Line) 源文件编码(Source File Encoding) 模块引用(Imports) 模块级的双下划线命名(Module level dunder names) 字符串引用(String Quotes) 表达式和语句中的空格(Whitespace In Expressions And Statements) 一些痛点(Pet Peeves) 其他建议(Other Recommendations) 何时在末尾加逗号(When to use trailing commas) 注释(Comments) 块注释(Block Comments) 行内注释(Inline Comments) 文档字符串(Documentation Strings) 命名约定(Naming Conventions) 首要原则(Overriding

运算符

故事扮演 提交于 2020-01-31 08:24:46
一、算术运算符 +、-、*、/、%、++、-- 共7个。 int x = 30 ; int y = 18 ; // 30 - 17 + 17 / 2 + 32 - 31 int z = x ++ - -- y + y ++ / 2 + ++ x - -- x ; System . out . println ( x ) ; //31 System . out . println ( y ) ; //18 System . out . println ( z ) ; //22 对于更复杂的运算应该使用Math类。 二、赋值运算符 = 拓展的赋值运算符:+=、-=、*=、/= 三、比较运算符 <、<=、>、>=、==、!= 比较运算符用于比较连个变量或两个值,如果符合预期得到true,否则得到false。 四、逻辑运算符 只能对boolean值进行运算。 && :与。两个条件同时为true,结果为true。 & :不短路与。 || :或。任一条件为true,结果为true。 | :不短路或。 ^ :异或。两个条件相同,同为true或同为false,结果为true。 ! :非。 &&与&的区别 &&:如果第一个操作数已经是false,&&运算符不会计算第二个操作数,称之为短路。 &:如果第一个操作数已经是false,&运算符依然会计算第二个操作数,称之为不短路。 ||与|的区别: ||

x86 汇编的基础知识

北慕城南 提交于 2020-01-31 05:33:12
x86 汇编器编程 基于x86 实现编译器首先得了解x86 平台的指令调度, 以下是一些我在实现编译器过程中用到的基础知识! 大部分内容参考了 青木的自制编译器, 基于GNU汇编器 c语言使用gcc 编译, 而gcc 编译器将c代码转化为汇编之后, 也是用的GNU as 的汇编器将汇编语言 .s 转化为.o,然后再连接, 因此如果自制编译器, 也是做到汇编这一步, 所以又得学x86 汇编器的使用方法! gcc 用的 GNU, 那我就直接使用gcc! 基本使用 编译: as hello.s //默认生成 a.out 也可以指定名字: as - o hello . o hello . s 生成目标文件后还要连接才可以执行。 gcc hello.o -o hello 最后就是 . / hello 语法 指令 指令包括 助记符 和 操作数 组成,比如 movl %esp, %ebp , movl 助记符, 后面两个为操作数, 操作数可以为多个!逗号分隔。 这个是由cpu直接执行的指令 汇编伪操作 以点 “.” 开头的, 末尾没有冒号 “:” 的 行 都是汇编伪操作行。 由汇编器执行,记录元数据和设定指令的属性。 汇编的首行缩进是没有影响的 标签 以冒号“:” 结尾的 行 都是标签行 冒号是语法, 标签名为冒号前面的值。 一般命名加上 . ,避免和代码里面的名字重复。 助记符后缀 后缀 大小

支持多种运算符的字符串表达式求值

冷暖自知 提交于 2020-01-30 08:39:04
一、说明 1. 输入字符串为中缀表达式,无需转为后缀表达式 2. 支持的运算符包括: 算术运算符:"+,-,*,/" 关系运算符:">,<,>=,<=,=,!="(注意等于运算符采用的是一个等号) 逻辑运算符:"&&,||" 3. 支持大于10的数字,不支持负数操作数,但支持中间结果和返回值为负数 二、算法原理&步骤 本文算法对中缀表达式形式字符串进行求值,同时支持与或运算和逻辑运算(若含有关系运算符或者逻辑运算符,则输出为1或者0)。类似于加减乘除,将关系运算符和逻辑运算符看作优先级低的运算符进行处理,优先级:算术运算符>关系运算符>逻辑运算符。 步骤: 1. 初始化两个空堆栈,一个存放操作数,一个存放运算符。 2. 从左至右扫描输入字符串,依次读取。 2.1 若为操作数,则压入操作数栈; 2.2 若为运算符,判断其优先级是否大于运算符栈栈顶元素优先级。若大于栈顶元素优先级,则直接压栈;否则,弹出栈顶元素operator,同时依次从操作数栈中弹出两个元素number1,number2,计算表达式(number2 operator number1)的值value,并将值value压入操作数栈。重复上述过程直至当前扫描的操作符优先级大于栈顶元素,然后将当前运算符压栈。 3. 弹出运算符栈顶元素operator,同时依次从操作数栈中弹出两个元素number1,number2,计算表达式

《操作系统真象还原》读书笔记 第3章

扶醉桌前 提交于 2020-01-30 03:20:16
0x1 地址、section、vstart 0x1.1 什么是地址 地址只是数字,描述各种符号在源程序中的位置,它是源代码文件中各符号偏移文件开头的距离。由于指令和变量所占内存大小不同,故他们相对于文件开头偏移量参差不齐。源码文件中各符号地址是由编译器来规划的。 编译器的工作就是给各符号编址。编译器根据所在硬件平台特性,将源代码中的每一个符号(指令和数据)都按照硬件平台的特性分配空间,在不考虑对齐情况下,这些符号都在空间上彼此相邻,连续分布,它们在程序中距第一个符号的距离便是他们载程序中的地址。(ps:跟文件文件偏移一个意思) 本质上,程序中各种数据结构的访问,就是通过“该数据结构的起始地址+该数据结构所占内存大小决定的”来实现的。这就解释了为什么要给出变量类型,因为变量类型规定了变量所占内存的大小,每种类型都有其对应的内存容量。 程序中定义的任何一个变量,在编译后的可执行文件中都会占据一席之地。此变量在文件中的位置是编译器来安排的。编译器无论怎么安排程序中的数据,必然有一个先后顺序,而占据第一位的数据,其地址便是整个程序的起始地址,在它后面的数据依次排开。 0x1.2 什么是section 编译器提供的关键字Section只是为了让程序员在逻辑上将程序划分成几个部分,因为它是伪指令,CPU不知道这是什么东西。一般section的应用场所是根据不同的属性人为地将程序划分几部分

第四次实训作业

我们两清 提交于 2020-01-29 15:28:23
编写“人”类及“测试类”。 源代码: “人”类: package aaa; public class person { private String name; private int age; public person(String name,int age){//构造方法:初始化姓名和年龄 this.name=name; this.age=age; } public person(String name){//构造方法:初始化姓名 this.name=name; } public void setName(String name){ this.name=name;//设置姓名 } public String getName(){ return name;//获取姓名 } public void setAge(int age){ if(age<0) this.age=0; else this.age=age; } public int getAge(){ return age; } public void printfMessage(){ System.out.println("name="+name+",age="+age); } public void addAge(){ age++; } } “测试类”: package aaa; public class

第二~五章小结 (2017-08-28 00:48:04)

微笑、不失礼 提交于 2020-01-29 02:53:21
第二章 x86处理器架构 中央处理单元(CPU)处理算术和逻辑运算。它包含了有限数量的存储位置,即寄存器,一个高频时钟用于同步其操作,一个控制单元和一个算术逻辑单元。内存存储单元在计算机程序运行时,保存指令和数据。总线是一组并行线路,在计算机不同部件之间传输数据。 一条机器指令的执行可以分为一系列独立的操作,称为指令执行周期。3个主要操作分别为取值、译码和执行。指令周期中的每一步都至少要花费一个系统时钟单位,即时钟周期。加载和执行过程描述了程序如何被操作系统定位,加载入内存,再由操作系统执行。 x86处理器系列有三种基本操作模式:保护模式、实地址模式和系统管理模式。此外,还有一个虚拟8086模式是保护模式的一个特例。Intel 64处理器系列有两种基本操作模式: 兼容模式和64位模式。在兼容模式下处理器可以运行16位和32位应用程序。 寄存器位CPU内的存储位置进行命名,其访问速度比常规内存要快很多。以下是对寄存器的简要说明: l 通用寄存器主要用于算术运算、数据传输和逻辑操作。 l 段寄存器存放预先分配的内存区域的基址,这些内存区域就是段。 l 指令指针寄存器存放的是下一条要执行指令的地址。 l 标志寄存器包含的独立二进制位于控制CPU的操作,并反映ALU操作的结果。 x86有一个浮点单元(FPU)专门用于高速浮点指令的执行。 微型计算机的心脏是它的主板,主板上有CPU

怎么找百度云资源(搜索)

点点圈 提交于 2020-01-28 20:19:44
到这里就把我们compute()方法讲解完了,讲完有没有对局部变量表和操作数栈的理解有所加深呢?说白了赋值号=后面的就是操作数,在这些操作数进行赋值,运算的时候需要内存存放,那就是存放在操作数栈中,作为临时存放操作数的一小块内存区域。 接下来我们再说说方法出口。 方法出口说白了不就是方法执行完了之后要出到哪里,那么我们知道上面compute()方法执行完之后应该回到main()方法第三行那么当main()方法调用compute()的时候,compute()栈帧中的方法出口就存储了当前要回到的位置,那么当compute()方法执行完之后,会根据方法出口中存储的相关信息回到main()方法的相应位置。 那么main()方同样有自己的栈帧,在这里有些不同的地方我们讲一下。 我们上面已经知道局部变量会存放在栈帧中的局部变量表中,那么main()方法中的math会存入其中,但是这里的math是一个对象,我们知道new出来的对象是存放在堆中的 ​ 那么这个math变量和堆中的对象有什么联系呢?是同一个概念么? 当然不是的,局部变量表中的math存储的是堆中那个math对象在堆中的内存地址 2.程序计数器 程序计数器也是线程私有的区域,每个线程都会分配程序计数器的内存,是用来存放当前线程正在运行或者即将要运行的jvm指令码对应的地址,或者说行号位置。 上述代码中每个指令码前面都有一个行号