汇编指令

MIT-6.828 Lab1实验报告

匿名 (未验证) 提交于 2019-12-02 21:53:52
Lab1:Booting a PC 本文主要介绍lab1,从内容上分为三部分,part1简单介绍了汇编语言,物理内存地址空间,BIOS。part2介绍了BIOS从磁盘0号扇区读取boot loader到0000:7c00处,并将cs:ip设置成0000:7c00。boot loader主要做两件事: 创建两个全局描述符表项(代码段和数据段),然后进入保护模式 从磁盘加载kernel到内存 part3主要介绍进入内核后的一些操作,首先会开启分页模式。还介绍了格式化输出,函数调用过程。 对应的lab主页为: lab1 Part 1: PC Bootstrap 本课程使用的汇编使用AT&T语法, Brennan's Guide to Inline Assembly 给出Intel语法和AT&T语法之间的一些对应关系。 物理地址内存空间可用下图来描述: +------------------+ <- 0xFFFFFFFF (4GB) | 32-bit | | memory mapped | | devices | | | /\/\/\/\/\/\/\/\/\/\ /\/\/\/\/\/\/\/\/\/\ | | | Unused | | | +------------------+ <- depends on amount of RAM | | | | | Extended Memory

Java并发编程:volatile关键字解析

匿名 (未验证) 提交于 2019-12-02 21:53:52
Java并发编程:volatile关键字解析    volatile这个关键字可能很多朋友都听说过,或许也都用过。在Java 5之前,它是一个备受争议的关键字,因为在程序中使用它往往会导致出人意料的结果。在Java 5之后,volatile关键字才得以重获生机。   volatile关键字虽然从字面上理解起来比较简单,但是要用好不是一件容易的事情。由于volatile关键字是与Java的内存模型有关的,因此在讲述volatile关键之前,我们先来了解一下与内存模型相关的概念和知识,然后分析了volatile关键字的实现原理,最后给出了几个使用volatile关键字的场景。   以下是本文的目录大纲:   一.内存模型的相关概念   二.并发编程中的三个概念   三.Java内存模型   四..深入剖析volatile关键字   五.使用volatile关键字的场景   若有不正之处请多多谅解,并欢迎批评指正。   请尊重作者劳动成果,转载请标明原文链接:    http://www.cnblogs.com/dolphin0520/p/3920373.html 一.内存模型的相关概念   大家都知道,计算机在执行程序时,每条指令都是在CPU中执行的,而执行指令过程中,势必涉及到数据的读取和写入。由于程序运行过程中的临时数据是存放在主存(物理内存)当中的,这时就存在一个问题

微机原理与接口技术笔记(二)

佐手、 提交于 2019-12-02 19:42:25
目录 转移类指令 循环控制指令 过程调用指令 中断控制指令 处理器控制指令 汇编语言源程序 过程 语句类型 伪指令 数据定义伪指令 符号定义伪指令 段定义伪指令 设定段寄存器伪指令 结束伪指令 过程定义伪指令 宏定义伪指令 调整偏移量伪指令 系统功能调用 单字符输入 字符串输入 单字符输出 字符串输出 返回操作系统功能 上一篇笔记: https://www.cnblogs.com/Tony100K/p/11653755.html 转移类指令 JMP Label 段内直接转移 MOV BX,1200H JMP BX执行完之后 IP=1200H了 MOV BX,1200 JMP WORD PTR[BX]段内间接转移,1200和1201这两个单元送给了IP 段间转移也是32位 JMP FAR Label 间接转移 JMP DWORD PTR[BX] DWORD指32位 低地址送IP,高地址送CS 条件转移范围只有 -128到127 ​ 统计内存数据段中以TABLE为首地址的100个8位带符号数中的正数\负数和零的个数 START: XOR AL,AL MOV PLUS,AL MOV MINUS,AL MOV ZERO,AL LEA SI,TABLE MOV CX,100 CHECK: LODSB OR AL,AL JS X1 JS X2 INC PLUS JMP NEXT X1: INC

精确解释java的volatile之可见性、原子性、有序性(通过汇编语言)

我是研究僧i 提交于 2019-12-02 18:52:00
一、实验环境: 1、Idea代码编辑器 2、jdk1.8.0_92 3、win10_x64 二、易产生误解的Java字段Volatile volatile保证了可见性,但是并不保证原子性!!! 1.volatile关键字的两层语义   一旦一个共享变量(类的成员变量、类的静态成员变量)被volatile修饰之后,那么就具备了两层语义:   1)保证了不同线程对这个变量进行操作时的可见性,即一个线程修改了某个变量的值,这新值对其他线程来说是立即可见的。   2)禁止进行指令重排序。 volatile的可见性,即任何时刻只要有任何线程修改了volatile变量的值,其他线程总能获取到该最新值。具体更多实现可以参阅缓存一致性协议。 2.那么volatile为什么又不能保证原子性呢? 以volatile int i = 10;i++;为例分析: i++实际为load、Increment、store三个操作。 某一时刻线程1将i的值load取出来,放置到cpu缓存中,然后再将此值放置到寄存器A中,然后A中的值自增1(寄存器A中保存的是中间值,没有直接修改i,因此其他线程并不会获取到这个自增1的值)。如果在此时线程2也执行同样的操作,获取值i==10,自增1变为11,然后马上刷入主内存。此时由于线程2修改了i的值,实时的线程1中的i==10的值缓存失效,重新从主内存中读取,变为11

【软考】【软件设计师】【知识模块】【第2章:程序设计语言基础知识】

旧时模样 提交于 2019-12-02 17:04:01
程序设计语言基础知识 2.1 程序设计语言概述   2.1.1 程序设计语言基本概念     低级语言,面向机器的语言,如汇编语言、机器语言;       特性:进行程序设计效率低,程序的可读性差,难以修改、维护,优势是运行速度特别快;     高级语言,面向各类应用的程序设计语言。如C、C++ 、Java、Python、Delphi 、Pascal、Php          语言处理程序:负责将高级语言翻译成计算机能理解的0和1的程序;     语言之间的翻译基本方式:       汇编、解释、编译;       汇编:对使用汇编语言写成的源程序进行翻译成目标程序(机器可直接执行)的过程;       解释:将源程序翻译成中间代码(需要配合专有解释器才可执行)的过程;       编译:将源程序翻译成机器可直接执行的目标程序的过程;                解释和编译的区别在于:       对源程序进行编译后的目标程序可以在机器上直接执行,不需要源程序和编译程序配合执行;机器上运行的是与源程序等价的目标程序。       对源程序进行解释后的中间代码,需要源程序和解释程序(解释器)配合执行;            程序语言的定义涉及的三个范畴:       语义、语法、语用;     所谓高级语言,即不依赖机器硬件的;     所谓通用的程序设计语言

汇编语言入门

天涯浪子 提交于 2019-12-02 08:24:45
  感觉汇编语言还是很酷的,查了很多资料,这里再发一篇。   学习编程其实就是学高级语言,即那些为人类设计的计算机语言。 但是,计算机不理解高级语言,必须通过编译器转成二进制代码,才能运行。学会高级语言,并不等于理解计算机实际的运行步骤。   计算机真正能够理解的是低级语言,它专门用来控制硬件。汇编语言就是低级语言,直接描述/控制 CPU 的运行。如果你想了解 CPU 到底干了些什么,以及代码的运行步骤,就一定要学习汇编语言。 汇编语言不容易学习,就连简明扼要的介绍都很难找到。下面我尝试写一篇最好懂的汇编语言教程,解释 CPU 如何执行代码。 一、汇编语言是什么?   我们知道,CPU 只负责计算,本身不具备智能。你输入一条指令(instruction),它就运行一次,然后停下来,等待下一条指令。 这些指令都是二进制的,称为操作码(opcode),比如加法指令就是00000011。编译器的作用,就是将高级语言写好的程序,翻译成一条条操作码。 对于人类来说,二进制程序是不可读的,根本看不出来机器干了什么。为了解决可读性的问题,以及偶尔的编辑需求,就诞生了汇编语言。   汇编语言是二进制指令的文本形式,与指令是一一对应的关系。比如,加法指令00000011写成汇编语言就是 ADD。只要还原成二进制,汇编语言就可以被 CPU 直接执行,所以它是最底层的低级语言。 二、来历   最早的时候

你说的曾经没有我的故事 提交于 2019-12-02 08:09:12
  不是科班毕业,直接学了Java入行,最近打算学C语言,了解一些入门级的语言,就看了一点入门的东西,这一篇汇编语言也是拾人牙慧,这里贴上原文地址,尊重原创。    《汇编语言》- 来自底层的较量 - 温故而知新 https://www.cnblogs.com/yougewe/p/8011911.html 。   百科的汇编语言定义:汇编语言(assembly language)是一种用于 电子计算机 、 微处理器 、 微控制器 或其他可编程器件的低级语言,亦称为符号语言。在汇编语言中,用 助记符 代替 机器指令 的 操作码 ,用地址符号或标号代替指令或 操作数 的地址。在不同的设备中,汇编语言对应着不同的机器语言 指令集 ,通过汇编过程转换成机器指令。特定的汇编语言和特定的机器语言指令集是一一对应的,不同平台之间不可直接移植。 一、汇编语言能干什么?仅次于机器语言?   计算机工作是由一系列的机器指令进行驱动工作的,这些指令是一系列二进制数字 0101000110,对应计算机的高低电平,而这些机器指令的集合就是机器语言,这已经是最底层,和硬件一对一了已经。   很明显,这样的机器语言是反人类的。只有天才和疯子才有能力去把控他。   于是汇编语言产生了。汇编语言就是将一些难于记忆的0100100转换为便于记忆的格式,让人能够稍微理解点。如 将寄存器bx的内容送到ax中

计算机处理器基础原理笔记

被刻印的时光 ゝ 提交于 2019-12-02 06:43:50
1. 计算机每执行一条指令的过程,可以分解成这样几个步骤。 (1) Fetch (取得指令) ,也就是从PC寄存器里找到对应的指令地址,根据指令地址从内存里把具体的指令,加载到指令寄存器中,然后把PC寄存器自增,在未来执行下一条指令。 (2) Decode (指令译码) ,也就是根据指令寄存器里面的指令,解析成要进行什么样的操作,是MIPS指令集的R、I、J中哪一种指令,具体要操作哪些寄存器、数据或者内存地址。 (3) Execute (执行指令) ,也就是实际运行对应的 R、I、J 这些特定的指令,进行算术逻辑操作、数据传输或者直接的地址跳转。 (4)重复进行(1)~(3)的步骤。 这其实就是一个永不停歇的“Fetch - Decode - Execute”的循环,这个循环称之为 指令周期 (Instruction Cycle)。 在取指令的阶段,指令是放在 存储器 里的,实际上, 通过 PC 寄存器和指令寄存器取出指令的过程,是由控制器(Control Unit )操作的。指令的解码过程,也由控制器进行 。到了执行指令阶段,无论是进行算术操作、逻辑操作的R型指令,还是进行数据传输、条件分支的I型指令,都是由 算术逻辑单元 (ALU)操作的,也就是由 运算器 处理的。不过,如果是一个简单的无条件地址跳转,那么我们可以直接在 控制器 里面完成,不需要用到运算器,如下所示:

汇编学习笔记 -第五章

霸气de小男生 提交于 2019-12-02 06:43:25
第五章 第 5 章 [BX] 和 loop 指令 5.1 [BX] 5.2 LOOP 指令 5.3 在 Debug 中跟踪用 loop 指令实现的循环程序 5.4 Debug 中跟踪用 loop 指令实现的循环程序 5.5 loop 和 [bx] 的联合应用 5.6 段前缀 5.7 一段安全的空间 5.8 段前缀的使用 第 5 章 [BX] 和 loop 指令 [bx] 和内存单元的描述 [bx] 表示一个内存单元,它的偏移地址在 bx 中,和 [0] 类似。 要完整的描述一个内存单元,需要两种信息:一是内存单元的地址,二是内存单元的长度(类型)。 loop loop 指令和循环有关。 我们定义的描述性的符号"()" ”()“表示括号内寄存器(或者其它)中存的内容 “()” 中的元素可以有 3 种类型:一是寄存器名,二是段寄存器名,三是内存单元的物理地址(一个 20 位数据)。 举例: “(X)” 表示的数据有两种类型:一是字节,二是字。由寄存器或具体的运算决定。 举例: 约定符号 idata 表示常量 指令中,在 “[···]” 里用一个常量 0 表示内存单元的偏移地址。 指令 说明 mov ax,[idata] 代表 mov ax,[l]、mov ax,[2]、 mov ax,[3]等。 mov bx,idata 代表 mov bx 1、mov bx,2、 mov bx,3 等

2019-2020-1学期 20192421 《网络空间安全专业导论>>第三周学习总结

孤街浪徒 提交于 2019-12-02 01:39:38
在简略学习了第六章和第七章的内容后,我对计算机的程序设计层有了新的了解,这两章分别从低级程序设计语言与伪代码以及问题求解与算法设计两个方面对程序设计层进行了阐述,下面是我的收获与问题。 *** 第六章低级程序设计语言与伪代码*** 6.1 计算机操作 计算机:计算机是能够存储,检索和处理数据的可编程电子设备。可编程的,存储,检索和处理是这个定义中的操作字。 存储,检索和处理是计算机能够对数据执行的动作。 控制单元执行的指令能够把数据存储到机器的内存中,在计器内存中检索数据,在算数逻辑单元中以某种方式处理数据。 6.2 机器语言 机器语言:由计算机直接使用的二进制编码指令构成的语言。【也是每种机器有的一个特定的能够被执行的操作集合】 Pep/8:一台虚拟机 虚拟机:为了模拟真实机器的重要特征而设计的假想机器。 Pep/8所反映的重要特性 程序计数器(PC):其中包括下一条即将被执行的指令的地址 指令寄存器(IR):其中包含正在被执行的指令的一个副本 累加器(是一个用来保存操作数据和结果的寄存器) 一个字节能够表示的最大十进制数是255,用二进制表示是111111,用十六进制表示是FF。一个字(16位)能够表示的最大十进制数是65535,用二进制表示是1111111111111用十六进制表示是FFFF。如果既要表示正数,又要表示负数,那么在量级上就会少一位(因为有一位用于表示符号)