汇编指令

程序员需要了解的硬核知识之CPU

有些话、适合烂在心里 提交于 2019-12-01 18:50:02
大家都是程序员,大家都是和计算机打交道的程序员,大家都是和计算机中软件硬件打交道的程序员,大家都是和 CPU 打交道的程序员,所以,不管你是玩儿硬件的还是做软件的,你的世界都少不了计算机最核心的 - CPU CPU是什么 CPU 的全称是 Central Processing Unit ,它是你的电脑中最 硬核 的组件,这种说法一点不为过。CPU 是能够让你的计算机叫 计算机 的核心组件,但是它却不能代表你的电脑,CPU 与计算机的关系就相当于大脑和人的关系。它是一种小型的计算机芯片,它嵌入在台式机、笔记本电脑或者平板电脑的主板上。通过在单个计算机芯片上放置数十亿个微型晶体管来构建 CPU。 这些晶体管使它能够执行运行存储在系统内存中的程序所需的计算,也就是说 CPU 决定了你电脑的计算能力。 CPU 实际做什么 CPU 的核心是从程序或应用程序获取指令并执行计算。此过程可以分为三个关键阶段: 提取,解码和执行 。CPU从系统的 RAM 中提取指令,然后解码该指令的实际内容,然后再由 CPU 的相关部分执行该指令。 RAM : 随机存取存储器(英语:Random Access Memory,缩写: RAM ),也叫主存,是与 CPU 直接交换数据的内部存储器。它可以随时读写(刷新时除外),而且速度很快,通常作为操作系统或其他正在运行中的程序的 临时数据存储介质 CPU 的内部结构

程序员需要了解的硬核知识之CPU

柔情痞子 提交于 2019-12-01 18:46:47
大家都是程序员,大家都是和计算机打交道的程序员,大家都是和计算机中软件硬件打交道的程序员,大家都是和 CPU 打交道的程序员,所以,不管你是玩儿硬件的还是做软件的,你的世界都少不了计算机最核心的 - CPU CPU是什么 CPU 的全称是 Central Processing Unit ,它是你的电脑中最 硬核 的组件,这种说法一点不为过。CPU 是能够让你的计算机叫 计算机 的核心组件,但是它却不能代表你的电脑,CPU 与计算机的关系就相当于大脑和人的关系。它是一种小型的计算机芯片,它嵌入在台式机、笔记本电脑或者平板电脑的主板上。通过在单个计算机芯片上放置数十亿个微型晶体管来构建 CPU。 这些晶体管使它能够执行运行存储在系统内存中的程序所需的计算,也就是说 CPU 决定了你电脑的计算能力。 CPU 实际做什么 CPU 的核心是从程序或应用程序获取指令并执行计算。此过程可以分为三个关键阶段: 提取,解码和执行 。CPU从系统的 RAM 中提取指令,然后解码该指令的实际内容,然后再由 CPU 的相关部分执行该指令。 RAM : 随机存取存储器(英语:Random Access Memory,缩写: RAM ),也叫主存,是与 CPU 直接交换数据的内部存储器。它可以随时读写(刷新时除外),而且速度很快,通常作为操作系统或其他正在运行中的程序的 临时数据存储介质 CPU 的内部结构

程序员需要了解的硬核知识之CPU

柔情痞子 提交于 2019-12-01 18:45:39
大家都是程序员,大家都是和计算机打交道的程序员,大家都是和计算机中软件硬件打交道的程序员,大家都是和 CPU 打交道的程序员,所以,不管你是玩儿硬件的还是做软件的,你的世界都少不了计算机最核心的 - CPU CPU是什么 CPU 的全称是 Central Processing Unit ,它是你的电脑中最 硬核 的组件,这种说法一点不为过。CPU 是能够让你的计算机叫 计算机 的核心组件,但是它却不能代表你的电脑,CPU 与计算机的关系就相当于大脑和人的关系。它是一种小型的计算机芯片,它嵌入在台式机、笔记本电脑或者平板电脑的主板上。通过在单个计算机芯片上放置数十亿个微型晶体管来构建 CPU。 这些晶体管使它能够执行运行存储在系统内存中的程序所需的计算,也就是说 CPU 决定了你电脑的计算能力。 CPU 实际做什么 CPU 的核心是从程序或应用程序获取指令并执行计算。此过程可以分为三个关键阶段: 提取,解码和执行 。CPU从系统的 RAM 中提取指令,然后解码该指令的实际内容,然后再由 CPU 的相关部分执行该指令。 RAM : 随机存取存储器(英语:Random Access Memory,缩写: RAM ),也叫主存,是与 CPU 直接交换数据的内部存储器。它可以随时读写(刷新时除外),而且速度很快,通常作为操作系统或其他正在运行中的程序的 临时数据存储介质 CPU 的内部结构

计算机基础之编程语言

只愿长相守 提交于 2019-12-01 17:37:54
编程语言分类 一、机器语言 只要谈到计算机基础,有一个东西是我们无法避免的,那就是编程到底是什么? 现在想象这样一个场景,如果奴隶来自不同的国家,作为尊贵而又穷逼买不起管家的奴隶主的我们则需要和奴隶有一定的沟通才能控制奴隶。 如果把奴隶换成计算机,由于计算机以二进制的形式存储数据的,如果我们想要奴役计算机,则需要使用二进制编写程序。也就是说,如果我们需要和计算机沟通,那我们必须得会二进制代码编程。而这个二进制编码则是使用机器语言编程,直接操作硬件。它的优缺点如下: 优点:执行效率高(还能再快吗?不能了。) 缺点:开发的效率低 1.1机器语言编程 由于计算机内部只能接受二进制代码,因此,用二进制代码0和1描述的指令称为机器指令,全部机器指令的集合构成了计算机的机器语言,用机器语言编程的程序陈伟目标程序。只有目标程序才能被计算机直接识别和执行。但是机器语言编程的程序无明显特征,难以记忆,不便阅读和书写,且依赖于具体机种,局限性大,机器语言属于低级语言。 用机器语言编写程序,编程人员要首先熟记所使用计算机的全部指令代码和代码的涵义。手编程序时,程序员得自己处理每条指令和每一条数据的存储分配和输入输出,还得记住编程过程中每步所用的工作单元处在何种状态。这是一件十分繁琐的工作。编写程序花费的时间往往是十几运行时间的几十倍或几百倍。而且,编程的程序全部是0和1的指令代码,直观性差,还容易出错

Java 中的 volatile 关键字

徘徊边缘 提交于 2019-12-01 13:11:43
Java 中 volatile 关键字是一个类型修饰符。JDK 1.5 之后,对其语义进行了增强。 保证了不同线程对共享变量进行操作时的可见性,即一个线程修改了共享变量的值,共享变量修改后的值对其他线程立即可见 通过禁止编译器、CPU 指令重排序和部分 happens-before 规则,解决有序性问题 volatile 可见性的实现 在生成汇编代码指令时会在 volatile 修饰的共享变量进行写操作的时候会多出 Lock 前缀的指令 Lock 前缀的指令会引起 CPU 缓存写回内存 一个 CPU 的缓存回写到内存会导致其他 CPU 缓存了该内存地址的数据无效 volatile 变量通过缓存一致性协议保证每个线程获得最新值 缓存一致性协议保证每个 CPU 通过嗅探在总线上传播的数据来检查自己缓存的值是不是修改 当 CPU 发现自己缓存行对应的内存地址被修改,会将当前 CPU 的缓存行设置成无效状态,重新从内存中把数据读到 CPU 缓存 看一下我们之前的一个可见性问题的测试例子 package constxiong.concurrency.a014; /** * 测试可见性问题 * @author ConstXiong */ public class TestVisibility { //是否停止 变量 private static boolean stop = false;

adr adrl ldr mov简单科普

时光毁灭记忆、已成空白 提交于 2019-12-01 12:47:41
ADR是一条小范围的地址读取伪指令,它将基于PC的相对偏移的地址值读到目标寄存器中。格式:ADR register,exper。 编译源程序时,汇编器首先计算当前PC值(当前指令位置)到exper的距离,然后用一条ADD或者SUB指令替换这条伪指令, 例如:ADD register,PC,#offset_to_exper。 注意 ,标号exper与指令必须在同一代码段。 比如:adr r0, _start ://将指定地址赋到r0中 ......... _start: b _start r0的值为标号_start与此指令的距离差 + PC值。 ADRL : 这是一条中等范围的地址读取伪指令,它将基于PC的相对偏移的地址值读到目标寄存器中。格式:ADRL register,exper。编译源程序时,汇编器会用两条合适的指令替换这条伪指令。 比如: ADD register,PC,offset1 ADD register,register,offset2 与ADR相比,它能读取更大范围的地址。 注意 ,标号exper与指令必须在同一代码段。 接下来是 LDR ,首先要说两个家伙,他们都叫LDR。 一个是LDR伪指令,一个是LDR指令 ,名字相同却不是一个东西。 区分的方法就是看第二个参数, 如果有等号,就是伪指令 。 LDR 指令: 例: ldr r0, 0x12345678

c++程序编辑、预处理、编译、链接生成可执行文件

杀马特。学长 韩版系。学妹 提交于 2019-12-01 10:26:16
1. 编辑:也就是编写C/C++程序 2. 预处理:相当于根据预处理指令组装新的C/C++程序。经过预处理,会产生一个没有宏定义,没有条件编译指令,没有特殊符号的输出文件,这个文件的含义同原本的文件无异,只是内容上有所不同。 3. 编译:将预处理完的文件进行一系列词法分析、语法分析、语义分析及优化后,产生相应的汇编代码文件。 4. 链接:通过链接器将一个个目标文件(或许还会有库文件)链接在一起生成一个完整的可执行程序。 链接程序的主要工作就是将有关的目标文件彼此相连接,也就是将在一个文件中引用的符号同该符号在另外一个文件中的定义连接起来,使得所有的这些目标文件成为一个能够被操作系统装入执行的统一整体。在此过程中会发现被调用的函数未被定义。 来源: https://www.cnblogs.com/didiaoxiaoguai/p/11681730.html

x86-x64寄存器及CallStack调用栈

心不动则不痛 提交于 2019-12-01 10:16:07
Intel 32位体系结构(简称IA32)处理器包含8个通用寄存器,如下图所示:     EIP是指令寄存器,指向处理器下条等待执行的指令地址(代码段内的偏移量),每次执行完相应汇编指令EIP值就会增加。EIP是个特殊寄存器,不能像访问通用寄存器那样访问它,即不可对EIP进行寻址操作。EIP可被jmp、call和ret等指令隐含地改变 函数调用栈的典型内存布局如下图所示: 函数调用过程中的主要指令: 压栈(push): 栈顶指针ESP减小4个字节;以字节为单位将寄存器数据(四字节,不足补零)压入堆栈,从高到低按字节依次将数据存入ESP-1、ESP-2、ESP-3、ESP-4指向的地址单元。 出栈(pop): 栈顶指针ESP指向的栈中数据被取回到寄存器;栈顶指针ESP增加4个字节。 调用(call): 将当前的指令指针EIP(该指针指向紧接在call指令后的下条指令)压入堆栈,以便返回时能恢复执行下条指令;然后设置EIP指向被调函数代码开始处,以跳转到被调函数的入口地址执行。 离开(leave): 恢复主调函数的栈帧以准备返回。 等价于指令序列: movl %ebp, %esp(恢复原ESP值,指向被调函数栈帧开始处) popl %ebp(恢复原ebp的值,即主调函数帧基指针)。 返回(ret): 与call指令配合,用于从函数或过程返回。从栈顶弹出返回地址

Y86-64指令集体系结构1

╄→尐↘猪︶ㄣ 提交于 2019-12-01 10:06:32
一. 乱糟糟的概念 指令集体系结构(ISA ):一个处理器支持的指令和指令的字节级编码(每条指令被编码成由一个字节序列或多个字节序列组成的二进制格式) 不同的处理器家族有不同的ISA(例如Intel IA32和x86-64、IBM/Freescale Power和ARM处理器家族)有不同的ISA 同一处理器家族的不同处理器有相同的ISA ISA为编译器编写者和处理器设计人员之间提供了一个概念抽象层:编译器编写者只需知道允许哪些指令,指令的字节级编码是什么;而处理器设计者只需建造出执行这些指令对应的二进制编码的处理器。 计算机科学的重要思想:用巧妙的方法在提高性能的同时又保持一个更简单、更抽象模型的功能。 数字硬件设计:基本构件块,如何连接以及操作,硬件控制语言(硬件系统控制部分的简单语言,用它来描述处理器设计) 二. 创建Y86-64指令集 较x86-64处理器支持的指令集而言,Y86-64指令集的 数据类型 、 指令 、 寻址方式 较少。 好处在于: 字节级编码简单,CPU译码逻辑简单 。 可以实现一些处理整数的程序。 在这一章中,我们会学习到如何用这个新定义出来的Y86-64指令集来设计处理器,并自己设计出来一个处理器, CMU设计了一些研究和测试处理器设计的工具,包括:Y86-64的汇编器,以及运行Y86-64程序的模拟器

计算机系统导论——读书笔记——第四章 处理器体系结构(持续更新)

别等时光非礼了梦想. 提交于 2019-12-01 08:03:09
2019年10月14日 1.指令集体系结构(Instruction-Set Architecture, ISA):一个处理器支持的指令和指令的字节级编码. 2.硬件控制语言(Hardware Control Language, HCL):一种描述硬件系统控制部分的简单语言. 4.1 Y86-64指令集体系结构 状态单元、指令集和他们的编码、一组编程规范、异常事件处理 4.1.1 程序员可见的状态 4.1.2 Y86-64指令 1. Y86-64 vs x86-64 : Y86-64指令集是x86-64的子集,只包含8字节(q)操作 前者简单,后者紧凑(常数值编码灵活、字段不固定) 2. Y86-64指令 (1)movq指令:irmovq,rrmovq,mrmovq,rmmovq(格式为: 源+目的+movq,源和目的包括i(instant number),r(register),m(memory);注意,不允许immovq或mmmovq) (2)4个整数操作:addq,subq,andq,xorq(注意,只对寄存器操作,同时设置条件码ZF、SF、OF) (3)7个跳转指令:jmp,jle,jl,je,jne,jge,jg (4)6个条件传送指令:cmovle,cmovl,cmove,cmovne,cmovge,cmovg(注意:只能寄存器->寄存器) (5)call,ret (6