计算机指令

计算机组成原理(四)

邮差的信 提交于 2020-03-03 08:37:24
指令和指令系统 计算机系统由硬件和软件两大部分组成。硬件指由中央处理器,存储器以及外围设备等组成的实际装置。软件是为了使用计算机而编写的各种系统的和用户的程序。程序由一个序列的计算机指令组成。 指令是计算机运行的最小的功能单元,是指挥计算机硬件运行的命令,是由多个二进制位组成的位串,是计算机硬件可以直接识别和执行的信息体。指令中应指明指令所完成的操作,并明确操作对象。 一台计算机提供的全部指令构成该计算机的指令系统。指令用于程序设计人员告知计算机执行一个最基本运算,处理功能,多条指令可以组成一个程序,完成一项预期的任务。 来源: CSDN 作者: pk_20140716 链接: https://blog.csdn.net/pk_20140716/article/details/104617804

JVM解毒——JVM与Java体系结构

笑着哭i 提交于 2020-03-02 10:53:42
你是否也遇到过这些问题? 运行线上系统突然卡死,系统无法访问,甚至直接OOM 想解决线上JVM GC问题,但却无从下手 新项目上线,对各种JVM参数设置一脸懵逼,直接默认,然后就JJ了 每次面试都要重新背一遍JVM的一些原理概念性东西 这段广告语写的好,趁着在家办公学习下JVM,先列出整体知识点 Java开发都知道JVM是Java虚拟机,上学时还用过的VM也叫虚拟机,先比较一波 虚拟机与Java虚拟机 所谓虚拟机(Virtual Machine),就是一台虚拟的计算机。它是一款软件,用来执行一系列虚拟计算机指令。大体上,虚拟机可以分为系统虚拟机和程序虚拟机。 Visaual Box,VMware就属于系统虚拟机,它们完全是对物理计算机的仿真,提供了一个可运行完整操作系统的软件平台 程序虚拟机的典型代表就是Java虚拟机,它专门为执行单个计算机程序而设计,在Java虚拟机中执行的指令我们称为Java字节码指令 JVM 是什么 JVM 是 Java Virtual Machine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。 Java虚拟机是二进制字节码的运行环境,负责装载字节码到其内部,解释/编译为对应平台的机器指令执行。每一条Java指令,Java虚拟机规范中都有详细定义,如怎么取操作数

AT&T的汇编格式&X86内联汇编

徘徊边缘 提交于 2020-03-02 04:47:09
AT&T的汇编格式 一 基本语法 语法上主要有以下几个不同. ★ 寄存器命名原则 AT&T: %eax Intel: eax ★源/目的操作数顺序 AT&T: movl %eax,%ebx Intel: mov ebx,eax ★常数/立即数的格式 AT&T: movl $_value,%ebx Intel: mov eax,_value 把_value的地址放入eax寄存器 AT&T: movl $0xd00d,%ebx Intel: mov ebx,0xd00d ★ 操作数长度标识 AT&T: movw %ax,%bx Intel: mov bx,ax ★寻址方式 AT&T: immed32(basepointer,indexpointer,indexscale) Intel: [basepointer + indexpointer*indexscale + imm32) Linux工作于保护模式下,用的是32位线性地址,所以在计算地址时不用考虑segment:offset的问题.上式中的地址应为: imm32 + basepointer + indexpointer*indexscale 下面是一些例子: ★直接寻址 AT&T: _booga ; _booga是一个全局的C变量 注意加上$是表示地址引用,不加是表示值引用. 注:对于局部变量,可以通过堆栈指针引用. Intel

Java 并发编程:核心理论

此生再无相见时 提交于 2020-03-01 20:23:14
并发编程是Java程序员最重要的技能之一,也是最难掌握的一种技能。它要求编程者对计算机最底层的运作原理有深刻的理解,同时要求编程者逻辑清晰、思维缜密,这样才能写出高效、安全、可靠的多线程并发程序。本系列会从线程间协调的方式(wait、notify、notifyAll)、Synchronized及Volatile的本质入手,详细解释JDK为我们提供的每种并发工具和底层实现机制。在此基础上,我们会进一步分析java.util.concurrent包的工具类,包括其使用方式、实现源码及其背后的原理。本文是该系列的第一篇文章,是这系列中最核心的理论部分,之后的文章都会以此为基础来分析和解释。 一、共享性   数据共享性是线程安全的主要原因之一。如果所有的数据只是在线程内有效,那就不存在线程安全性问题,这也是我们在编程的时候经常不需要考虑线程安全的主要原因之一。但是,在多线程编程中,数据共享是不可避免的。最典型的场景是数据库中的数据,为了保证数据的一致性,我们通常需要共享同一个数据库中数据,即使是在主从的情况下,访问的也同一份数据,主从只是为了访问的效率和数据安全,而对同一份数据做的副本。我们现在,通过一个简单的示例来演示多线程下共享数据导致的问题: 代码段一: package com.paddx.test.concurrent; public class ShareData {

计算机指令在CPU中的执行过程(图文版)

穿精又带淫゛_ 提交于 2020-03-01 12:08:25
为了了解指令的大概流程,下面以加法指令做以说明( 引用《计算机原理》 )。 指令形式: ADD EA 该指令一个隐含的操作数存在累加器(AC)中,EA为另一个操作数在主存当中的有效地址。 该指令是把AC和EA的数据相加,最后把计算的和送回AC中,即AC+EA -> AC。 1. 取指 把PC的内容(指令地址)装入地址寄存器(AR),送上地址总线,由地址总线找到对应的主存,取出指令码,然后通过数据总线将指令码传给CPU的指令寄存器(IR)。 2. 分析 把IR中的指令交给译码器译码,识别出这是一条AC与主存数据相加的指令,将指令中的EA输出到地址总线,地址总线在加法指令的控制下从主存读出数据,然后将读出的数据通过数据总线送到CPU的暂存寄存器(TR)中。 在指令译码的同时,PC的值会加1,指向下一个指令地址。 3. 执行 将AC中的数据和TR中的数据传入运算中心(ALU)进行加法运算,再将计算之和通过数据总线传给AC,结束指令。 以上只列出最关键的3个步骤,其中一个指令的操作数是以直接寻址的方式给出的(EA),即译码后可立即进行访存操作。如果指令的操作数是由其他寻址方式给出,则还需要进一步取址得出EA,再由EA去存储器取值。 来源: oschina 链接: https://my.oschina.net/u/3536632/blog/2934131

C语言获取SYSTEMTIME

╄→尐↘猪︶ㄣ 提交于 2020-03-01 04:55:10
C语言中如何获取时间?精度如何? 1 使用time_t time( time_t * timer ) 精确到秒 2 使用clock_t clock() 得到的是CPU时间精确到1/CLOCKS_PER_SEC秒 3 计算时间差使用double difftime( time_t timer1,time_t timer0 ) 4 使用DWORD GetTickCount() 精确到毫秒 5 如果使用MFC的CTime类,可以用CTime::GetCurrentTime() 精确到秒 6 要获取高精度时间,可以使用 BOOLQueryPerformanceFrequency(LARGE_INTEGER lpFrequency) 获取系统的计数器的频率 BOOLQueryPerformanceCounter(LARGE_INTEGER lpPerformanceCount) 获取计数器的值 然后用两次计数器的差除以Frequency就得到时间。 7 Multimedia Timer Functions The following functions areused with multimedia timers. timeBeginPeriod/timeEndPeriod/timeGetDevCaps/timeGetSystemTime // ************************

【计算机组成原理】第一章、计算机系统概述

流过昼夜 提交于 2020-02-29 22:22:27
计算机性能指标 吞吐量 :表征一台计算机在某一时间间隔内能够处理的信 息量,单位是字节/秒(B/S)。 响应时间 :表征从输入有效到系统产生响应之间的时间度 量,用时间单位来度量,例如微秒(10-6S)、纳秒(10-9S)。 利用率 :表示在给定的时间间隔内,系统被实际使用的时 间所占的比率,一般用百分比表示。 处理机字长 :指处理机运算器中一次能够完成二进制数运 算的位数。当前处理机的字长有8位、16位、32位、64位。  字长越长,表示计算的精度越高。 总线宽度 :一般指CPU中运算器与存储器之间进行互连的内 部总线二进制位数。 存储器容量 :存储器中所有存储单元的总数目,通常用KB、MB、GB、TB来表示。其中: K = 2 1 0 , M = 2 2 0 , G = 2 3 0 , T = 2 4 0 , B = 8 位 ( 1 个 字 节 ) K=2^10,M=2^20,G=2^30,T=2^40,B=8位(1个字节) K = 2 1 0 , M = 2 2 0 , G = 2 3 0 , T = 2 4 0 , B = 8 位 ( 1 个 字 节 ) 存储器容量越大,记忆的二进制数越多。 存储器带宽 :存储器的速度指标,单位时间内从存储器读出的 二进制数信息量,一般用字节数/秒表示。 主频/时钟周期 :CPU的工作节拍受主时钟控制,主时钟不断 产生固定频率的时钟

紫薇星上的数据结构(10)

怎甘沉沦 提交于 2020-02-29 16:46:53
终于来到最后一部分了,算法,这篇文章的出现也意味着这个系列就结束了,向着最后的胜利冲冲冲! 算法(Algorithm)是指解题方案的准确而完整的描述,是一系列解决问题的清晰指令,算法代表着用系统的方法描述解决问题的策略机制。也就是说,能够对一定规范的输入,在有限时间内获得所要求的输出。如果一个算法有缺陷,或不适合于某个问题,执行这个算法将不会解决这个问题。不同的算法可能用不同的时间、空间或效率来完成同样的任务。一个算法的优劣可以用空间复杂度与时间复杂度来衡量。 这一部分我们要整理的算法一般都是前人已经完善好的,大家如果不能理解其原理,那就学会如何使用就可以了。 简单来说算法就是解决特定问题的求解步骤的描述,在计算机中表现为指令的有限序列,并且每条指令都表示一个或者多个操作。这里要注意:同一个问题可能有多种不同的解决算法;没有一个通用算法可以解决所有问题。 一个算法应该具有以下 五个重要的特征 : 有穷性(Finiteness):算法的有穷性是指算法必须能在执行有限个步骤之后终止; 确切性(Definiteness):算法的每一步骤必须有确切的定义; 输入项(Input):一个算法有0个或多个输入,以刻画运算对象的初始情况,所谓0个输入是指算法本身定出了初始条件; 输出项(Output):一个算法有一个或多个输出,以反映对输入数据加工后的结果。没有输出的算法是毫无意义的; 可行性

反汇编学习

让人想犯罪 __ 提交于 2020-02-29 07:06:48
(转: http://www.kuqin.com/assemble/20071122/2492.html ) 汇编语言和CPU以及内存,端口等硬件知识是连在一起的. 这也是为什么汇编语言没有通用性的原因. 下面简单讲讲基本知识(针对INTEL x86及其兼容机)   ============================   x86汇编语言的指令,其操作对象是CPU上的寄存器,系统内存,或者立即数. 有些指令表面上没有操作数, 或者看上去缺少操作数, 其实该指令有内定的操作对象, 比如push指令, 一定是对SS:ESP指定的内存操作, 而cdq的操作对象一定是eax / edx.    在汇编语言中,寄存器用名字来访问. CPU 寄存器有好几类, 分别有不同的用处:   1. 通用寄存器:   EAX,EBX,ECX,EDX,ESI,EDI,EBP,ESP(这个虽然通用,但很少被用做除了堆栈指针外的用途)      这些32位可以被用作多种用途,但每一个都有"专长". EAX 是"累加器"(accumulator), 它是很多加法乘法指令的缺省寄存器. EBX 是"基地址"(base)寄存器, 在内存寻址时存放基地址. ECX 是计数器(counter), 是重复(REP)前缀指令和LOOP指令的内定计数器. EDX是...(忘了..哈哈)但它总是被用来放整数除法产生的余数.

浅析VS2010反汇编

China☆狼群 提交于 2020-02-29 07:04:36
第一篇 1. 怎样进行反汇编 在调试的环境下,我们能够很方便地通过反汇编窗体查看程序生成的反汇编信息。 例如以下图所看到的。 记得中断程序的运行,不然看不到反汇编的指令 看一个简单的程序及其生成的汇编指令 #include<stdio.h> #include<windows.h> const long Lenth=5060000/5; int main(){ while(true){ for(long i=0;i<Lenth;i++){ ; } Sleep(10); } } 汇编窗体 2. 预备知识 : 函数调用大家都不陌生,调用者向被调用者传递一些參数,然后运行被调用者的代码,最后被调用者向调用者返回结果,还有大家比較熟悉的一句话。就是函数调用是在栈上发生的,那么在计算机内部究竟是怎样实现的呢? 对于程序,编译器会对其分配一段内存。在逻辑上能够分为代码段。数据段,堆,栈 代码段:保存程序文本。指令指针EIP就是指向代码段。可读可运行不可写 数据段:保存初始化的全局变量和静态变量,可读可写不可运行 BSS:未初始化的全局变量和静态变量 堆(Heap):动态分配内存,向地址增大的方向增长。可读可写可运行 栈(Stack):存放局部变量。函数參数,当前状态。函数调用信息等, 向地址减小的方向增长 。很很重要,可读可写可运行 如图所看到的 寄存器 EAX :累加(Accumulator