计算机指令

volatile修饰符

半世苍凉 提交于 2020-02-04 12:37:10
什么是volatile? 一旦一个共享变量(类的成员变量、类的静态成员变量)被volatile修饰之后,那么就具备了两层语义:   1)保证了不同线程对这个变量进行操作时的可见性,即一个线程修改了某个变量的值,这新值对其他线程来说是立即可见的。   2)禁止进行指令重排序。 volatile 是一个类型修饰符。volatile 的作用是作为指令关键字,确保本条指令不会因编译器的优化而省略。 volatile 的特性 保证了不同线程对这个变量进行操作时的可见性,即一个线程修改了某个变量的值,这新值对其他线程来说是立即可见的。(实现可见性) 禁止进行指令重排序。(实现有序性) volatile 只能保证对单次读/写的原子性。i++ 这种操作不能保证原子性。 volatile 保证多线程的可见性,首要要明白内存模型的相关概念: 大家都知道,计算机在执行程序时,每条指令都是在CPU中执行的,而执行指令过程中,势必涉及到数据的读取和写入。由于程序运行过程中的临时数据是存放在主存(物理内存)当中的,这时就存在一个问题,由于CPU执行速度很快,而从内存读取数据和向内存写入数据的过程跟CPU执行指令的速度比起来要慢的多,因此如果任何时候对数据的操作都要通过和内存的交互来进行,会大大降低指令执行的速度。因此在CPU里面就有了高速缓存。   也就是,当程序在运行过程中

第3章 Javadoc指令使用详细介绍

笑着哭i 提交于 2020-02-04 11:30:46
本章要点: Javadoc指令使用详细介绍 关于标识符和关键字 Javadoc指令使用详细介绍 java里面的注释分单行注释、多行注释和文档注释。这里重点讨论javadoc 指令的实际使用。 1.单行注释: 使用双斜线"//"放在需要注释的内容之前 2.多行注释:使用"/ “注释开始,” /"注释结束。 3.文档注释:文档注释以"/**"开始, ​ 以"*/" 结束。 下面使用三个简单的案例介绍如何使用javadoc工具生成API文档。 案例1:javadoc命令生成简单的API文档: 1)来到JavadocTest.java和Test.java所在的路径 文件内容如下: 2)执行以下命令 $ javadoc -encoding GBK -d apidoc -windowtitle 测试 -doctitle 使用javadoc工具生成API文档 -header 我的类 *Test.java 参数解释: -encoding : javadoc执行时的编码指令,因为JavadocTest.java和Test.java中含有中文,所以要设置成GBK编码,否则会包“utf-8 不可编码”的错误 -d: 设置生成的API文档的路径,这里写“apidoc”会在当前路径处生成一个apidoc文件夹 -windowtitle:为api文档的浏览器窗口设置字符串标题。 -doctitle

20145206 《信息安全系统设计基础》第6周学习总结

巧了我就是萌 提交于 2020-02-04 04:19:17
20145206 《信息安全系统设计基础》第6周学习总结 教材学习内容总结 1.流水线化的处理器: 将每条指令的执行分解成五步,每个步骤由一个独立的硬件部分或者阶段来处理。指令步经流水线的各个阶段,且每个时钟周期有一条新指令进入流水线。所以处理器可以同时执行五条指令的不同阶段。 2.程序员可见的状态: Y86程序中的每条指令都会读取或者修改处理器状态中的某些部分。这称为程序员可见状态。 3.Stat 程序状态的最后一个部分是状态码Stat,它表明程序执行的总体状态;它会指示是正常运行还是出现了某种异常。 4.Y86 一个简单的、可以称之为IA32指令集的子集的指令集;只包括四字节整数操作,寻址方式比较少。指令编码长度从1——6字节不等。 关于指令结构,每条指令的第一个字节表明指令的类型;这个字节分为两个部分,每部分四位:高四位是代码部分(0——0xB),第四位是功能部分。这里补充一些缩写:立即数(i),寄存器(r)、存储器(m)。指令附加的寄存器指示符字节依次是数据源(如果是立即数,把这一位设置成0xf)、目的寄存器/基址寄存器。有些指令需要附加四字节的常数字,采用小端法(倒序)编码 5.stat代码可能取值反应了机器的不同状态—— AOK:正常操作(除此之外的任何状态都会使得处理器停止执行指令) HLT:处理器执行halt指令 ADR:遇到非法地址 INS:遇到非法指令 6

单片机的中断系统

独自空忆成欢 提交于 2020-02-02 04:38:04
有关单片机中断系统的概念:什么是中断,我们从一个生活中的例程引入。你正在家中看书,突然电话铃响了,你放下书本,去接电话,和来电话的人交谈,然后放下电话,回来继续看你的书。这就是生活中的“中断”的现象,就是正常的工作过程被外部的事件打断了。仔细研究一下生活中的中断,对于我们学习单片机的中断也很有好处。 第一、什么可经引起中断,生活中很多事件能引起中断:有人按了门铃了,电话铃响了,你的闹钟闹响了,你烧的水开了….等等诸如此类的事件,我们把能引起中断的称之为中断源,单片机中也有一些能引起中断的事件,8031中一共有5个:两个外部中断,两个计数/定时器中断,一个串行口中断。 第二、中断的嵌套与优先级处理:设想一下,我们正在看书,电话铃响了,同时又有人按了门铃,你该先做那样呢?如果你正是在等一个很重要的电话,你一般不会去理会门铃的,而反之,你正在等一个重要的客人,则可能就不会去理会电话了。如果不是这两者(即不等电话,也不是等人上门),你可能会按你常常的习惯去处理。总之这里存在一个优先级的问题,单片机中也是如此,也有优先级的问题。优先级的问题不仅仅发生在两个中断同时产生的情况,也发生在一个中断已产生,又有一个中断产生的情况,比如你正接电话,有人按门铃的情况,或你正开门与人交谈,又有电话响了情况。考虑一下我们会怎么办吧。 第三、中断的响应过程:当有事件产生

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

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

基础篇-java类文件结构

半腔热情 提交于 2020-02-01 13:48:06
问题:是不是只有java编译器才能完成java到class字节码文件的过程? Jython/Scala/Groovy/Jruby都是可以编译成字节码文件的,然后放到java虚拟机里面执行 问题:计算机执行的指令的时候都是执行的 0101010 这种形式的指令 class文件的组成内容: class文件格式: u1代表一个字节, u2代表两个字节, u4代表4俄字节, u8代表8个字节 来源: CSDN 作者: qq_26498709 链接: https://blog.csdn.net/qq_26498709/article/details/104128307

简单计算机系统综合设计(CPU)

末鹿安然 提交于 2020-02-01 10:36:09
简单计算机系统综合设计(CPU) 前言:作为一位来自于湖南大学的本科生,让我最难忘记的就是这一次CPU的综合设计了。学软件的我,贴一篇硬件编程没啥意思,纯当打发时间。 基本部件 数字逻辑实验中我们要求完成的有以下基本部件,使用VHDL源完成编程。 0000:指令寄存器IR, a) 模块的接口设计 控制信号:LDIR,CLK,I[7…0] 输入信号:需执行指令I[7…0] 输出信号:需执行指令out1[7…0] b) 功能实现 根据指令寄存器IR的功能可知: 当HALT = 1 时,输出信号 x[7…0] 为高阻态; 否则,当处于时钟下降沿时,LDIR = 1时,输出信号out[7…0]为输入信号I[7…0]。 VHDL的实现如下所示: library ieee; use ieee.std_logic_1164.all; entity IR is port (LDIR, CLK : in std_logic; I : in std_logic_vector(7 downto 0); OUT1 : out std_logic_vector(7 downto 0) ); end IR; architecture behavior of IR is signal command: std_logic_vector(7 downto 0); begin OUT1 <= command;

csapp-系统栈和ROP技术

无人久伴 提交于 2020-02-01 05:19:47
前言:总结的都是基于我在计算机系统学习中的相对个人重难点。 栈帧 栈帧的内部模拟图片( 来源于百度图片 ): 图上所述结构一步一步来看: 返回地址以上部分的参数是存储在调用函数p中的栈帧中的变量值。而这个值是为下一步被调函数Q传参做准备的。需要注意的是,存在该部分的条件是因为寄存器中最多传递六个整型(即整型和指针参数)。而当传入的个数大于6时,超过六的部分参数,需要直接存储在栈帧中,并且是倒着顺序存入栈帧中(由栈顶到栈底顺序)。 补充栈上的局部存储: 1:寄存器不够存放所有的本地数据; 2:对某一个局部变量使用地址运算符“&”,必须为它产生一个地址; 3:某些局部变量数数组或者结构时。 引用《深入了解计算机系统》书上的两个例子: 第一个: 在long caller函数调用被调函数swap之前,开辟空间,将arg1和arg2先放入栈中,并且rsp存着&arg1,rsp+8存着&arg2,然后再将返回地址放入栈中,进行调用函数swap_add。 第二个 发现传入的参数的个数是8个,并且存在几个参数传入的地址,那么我们首先选出地址引用的&x1,&x2,&x3,&x4和第七个x4与第八个参数&x4.那么如上图根据“对某一个局部变量使用地址运算符“&”,必须为它产生一个地址”原则,为x1,x2,x3,x4按顺序产生地址,然后第七个和第八个参数就按照倒序的顺序存入即可x4存在rsp,

第六周学习报告

筅森魡賤 提交于 2020-02-01 02:55:32
4.1Y86指令体系结构 程序员可见状态 ISA: 一个处理器支持的指令和指令的字节级编码称为~。 冒险: 一条指令的位置或者操作数依赖于其他仍在流水线中的指令。 程序员可见状态: Y86程序中的每条指令都会读取或修改处理器状态的某些部分 =>只要我们保证机器级程序能够访问程序员可见状态,就不需要完全按照ISA隐藏方式来表示和组织这个处理器状态。 Y86的处理器状态类似于IA32。 有8个程序寄存器。处理器每个程序寄存器储存一个字。寄存器%esp被入栈,出栈,调用和返回指令作为栈指针。 有3个一位条件码:ZF,SF, OF.保存最近的算术或者逻辑指令所造成影响的有关信息。 程序计数器PC:存放当前正在执行指令的地址。 存储器:(概念上来说是一个很大的字节数组)保存着程序和数据。Y86程序用虚拟地址来引用存储器位置。 程序状态的最后一部分状态码Stat,表明程序执行总体状态。 Y86指令 只包括四字节整数操作,所以称之为“字 ”。 Y86指令集,长度1~6字节不等。一条指令含有一个单字节的指令表示符,可能含有一个单字节的寄存器指示符,还可能含有一个四字节的常数字。 字段fn:指明是某个整数操作(OPL),数据移动条件(comvxx)或是分支条件(jxx)。所有数值都使用16进制。 Y86指令的更多细节: movl指令分成了四个不同的指令irmovl,rrmovl

20145235 《信息安全系统设计基础》第06周学习总结 _01

霸气de小男生 提交于 2020-02-01 02:03:28
20145235 《信息安全系统设计基础》第06周学习总结 _01 4.1.4 Y86异常 关于可见状态码Stat的几个值: 1:AOK 程序执行正常 2:HLT 表示处理器执行了一条halt指令 3:ADR 表示处理器从一个非法的存储器地址读或者向一个非法的存储器地址写 4:INS 表示遇到非法指令 4.1.5 Y86程序 “.”开头的词是汇编器命令,告诉他们汇编器调整命令,以便在哪产生代码或者插入数据 P239 Y86程序结构: 声明代码产生的起始地址 (.pos 0 ) 初始化栈指针和帧指针 为代码所声明的数据开辟地址 给栈分配空间 指令模拟器,成为YIS。 模拟器只打印出在模拟过程中被改变了的寄存器或存储器中的字。左边是原始值,右边是最终值。 4.1.6 对于“pushl %esp”在上学期的汇编中有详细指明:是现将数据push,然后对指针sp进行修改;而对于“popl %esp”,是先修改指针,然后再进行pop。然而4.1.6中说是不确定的。 4.2 逻辑设计和硬件控制语言HCL 要实现数字系统,需三个主要组成部分: 计算对位进行操作的逻辑结构、存储位的存储器元素,以及控制存储器元素更新的时钟信号。 4.2.1 逻辑门 逻辑运算:&&、||、! 位运算:&、|、~ 4.2.2 组合电路和HCL布尔表达式 将很多逻辑门组合成一个网,就能构建计算快,称为组合电路。限制