汇编指令

深入理解计算机系统——第二章学习笔记

别等时光非礼了梦想. 提交于 2020-01-09 00:14:45
2018-2019-1 20189224 《深入理解计算机系统》第二周学习总结 二进制信号能够容易的被表示、存储和传输。 主要研究三种数字表示:无符号编码——大于或等于0的数字;补码编码——有符号整数;浮点数——实数的科学计数法以2为基数的形式 计算机最小的可寻址内存单位:8位的块/字节 虚拟内存:机器级程序将内存视为一个大的字节数组 虚拟地址空间:所有可能地址的集合 虚拟地址以字为地址进行编码 计算机的字长:指明指针数据的标称大小 整数表示 补码转无符号编码 补码转二进制编码 补码转反码 补码转原码 有符号转无符号 无符号转有符号 整数运算 无符号加法 无符号求反 补码加法 补码的非 无符号乘法 补码乘法 上周测试 1.(B)就是位+上下文 A .数据 B .信息 C .知识 D .数据结构 解析:信息就是位+上下文:计算机系统中的所有信息都是由二进制串表示的,区分这些数据对象的唯一方法是读到这些数据的上下文。 2.Linux中,内核虚拟内存在虚拟地址空间的低端。(B) A .正确 B .错误 解析:p13 内核虚拟内存在虚拟地址空间的最顶端而不是最低端 3.实现进程这个抽象概念需要低级硬件和操作系统软件之间的紧密合作。(A) A .正确 B .错误 解析:p12 进程是操作系统对正在运行的程序的一种抽象。一个系统上可以同时运行多个进程,每个进程好像独占的使用硬件。所谓并发

第一周 ch01 课下测试

[亡魂溺海] 提交于 2020-01-09 00:08:51
1.Amdahl定律说明,我们对系统的某个部分做出重大改进,可以显著获得一个系统的加速比。(B) A .正确 B .错误 解析:Amdahl定律,该定律的主要思想是,当我们对系统的某个部分加速时,其对整个性能的影响取决于该部分的重要性和加速程度。 2.Linux中,内核虚拟内存在虚拟地址空间的低端。(B) A . 正确 B . 错误 解析:由上图可知内核虚拟内存在虚拟地址空间的最顶端而不是最低端 3.实现进程这个抽象概念需要低级硬件和操作系统软件之间的紧密合作。(A) A . 正确 B . 错误 解析:进程是操作系统对正在运行的程序的一种抽象。一个系统上可以同时运行多个进程,每个进程好像独占的使用硬件。所谓并发,是说一个进程的指令和另一个进程的指令交错执行。操作系统实现这种交错执行的机制称为上下文切换。操作系统跟踪进程运行所需的所有状态信息(也就是上下文),任何一个时刻,处理器只能运行一个进程。当操作系统决定要把控制权从当前进程转移到一个新进程时,就要进行上下文切换,即保存当前进程的上下文,恢复新进程的上下文,然后将控制权转交给新进程,新进程就从上次停止的地方开始执行。实现进程这个抽象概念需要低级硬件和操作系统软件之间的紧密合作 4.操作系统有两个基本功能:防止硬件被滥用;向应用供一致的机制来控制低级硬件设备。实现这两个功能相关的抽象有(ACD) A . 文件 B . 虚拟机 C

详解C中volatile关键字

我们两清 提交于 2020-01-08 08:28:00
volatile提醒编译器它后面所定义的变量随时都有可能改变,因此编译后的程序每次需要存储或读取这个变量的时候,都会直接从变量地址中读取数据。如果没有volatile关键字,则编译器可能优化读取和存储,可能暂时使用寄存器中的值,如果这个变量由别的程序更新了的话,将出现不一致的现象。下面举例说明。在DSP开发中,经常需要等待某个事件的触发,所以经常会写出这样的程序: short flag; void test() { do1(); while(flag==0); do2(); } 这段程序等待内存变量flag的值变为1(怀疑此处是0,有点疑问,)之后才运行do2()。变量flag的值由别的程序更改,这个程序可能是某个硬件中断服务程序。例如:如果某个按钮按下的话,就会对DSP产生中断,在按键中断程序中修改flag为1,这样上面的程序就能够得以继续运行。但是,编译器并不知道flag的值会被别的程序修改,因此在它进行优化的时候,可能会把flag的值先读入某个寄存器,然后等待那个寄存器变为1。如果不幸进行了这样的优化,那么while循环就变成了死循环,因为寄存器的内容不可能被中断服务程序修改。为了让程序每次都读取真正flag变量的值,就需要定义为如下形式: volatile short flag; 需要注意的是,没有volatile也可能能正常运行

volatile底层原理

独自空忆成欢 提交于 2020-01-07 17:41:37
前言 我们知道volatile关键字的作用是保证变量在多线程之间的可见性,它是java.util.concurrent包的核心,没有volatile就没有这么多的并发类给我们使用。 本文详细解读一下volatile关键字如何保证变量在多线程之间的可见性,在此之前,有必要讲解一下CPU缓存的相关知识,掌握这部分知识一定会让我们更好地理解volatile的原理,从而更好、更正确地地使用volatile关键字。 CPU缓存 CPU缓存的出现主要是为了解决CPU运算速度与内存读写速度不匹配的矛盾 ,因为CPU运算速度要比内存读写速度快得多,举个例子: 一次主内存的访问通常在几十到几百个时钟周期 一次L1高速缓存的读写只需要1~2个时钟周期 一次L2高速缓存的读写也只需要数十个时钟周期 这种访问速度的显著差异,导致CPU可能会花费很长时间等待数据到来或把数据写入内存。 基于此,现在CPU大多数情况下读写都不会直接访问内存(CPU都没有连接到内存的管脚),取而代之的是CPU缓存,CPU缓存是位于CPU与内存之间的临时存储器,它的容量比内存小得多但是交换速度却比内存快得多。而缓存中的数据是内存中的一小部分数据,但这一小部分是短时间内CPU即将访问的,当CPU调用大量数据时,就可先从缓存中读取,从而加快读取速度。 按照读取顺序与CPU结合的紧密程度,CPU缓存可分为: 一级缓存:简称L1

汇编期末复习

别来无恙 提交于 2020-01-07 08:19:03
汇编 记忆部分 进制转换 逻辑地址转换物理地址 1234h:0058h = 12340h+0058h = 12398h 数据存放为 小端原则 低字节在前,比如 12h 34h 56h 78h 短跳,近跳 jmp short target 机器码:EBXX jmp near ptr target 机器码:E9XXXX 近跳的相对长度只能有1个字节长 近跳占3个字节,也就是近跳可以跳2个字节长 XX的计算公式是目标位置减去下一条指令位置,注意:小段规则。 如果是跳回前面的指令,就是 100h-XX ,比如跳回上一条指令,就是EBFC,这里FC=100h-04h,04h相当于下一条指令减去目标指令 远跳 jmp far ptr target 写法是:jmp 段地址:偏移地址 寄存器是CPU中可以存储数据的器件 寄存器 ax, bx, cx, dx。 cs, ds, ss, es。 cs:代码段寄存器 ds:数据段寄存器 ss:栈段寄存器 es:程序首个段前100h的地址,用来存放exe的相关信息。 ip, sp, 注意ip只有jmp类型指令可以修改 只有 bx,bp,si,di 可以放到[]里面,bx, bp为基寄存器。 其中[bx] == ds:[bx] [bp] == ss:[bp] 标志位 影响标志位的指令有很多,比如位运算,加减乘除等。需要记住的只有下面这些。

微架构、指令集架构与汇编语言的关系

和自甴很熟 提交于 2020-01-06 18:57:43
最近老是碰到x86 IA32 MIPS什么的对应的汇编又是有好几种,感觉很迷。遂查资料理清这些个概念如下(大部分内容来自维基百科,如有错误谢指正!) 微架构、指令集架构和汇编语言这三者的关系大概是这样的,我们分别来介绍下 指令集 指令就是要计算机执行某种操作的命令。 从计算机组成的层次结构来说 指令分为微指令(微程序级的指令,属硬件)、宏指令(若干机器指令组成的 属软件)和机器指令(二者之间 简称指令)。 我们这里只讨论机器指令,每一条机器指令指令可以完成一个独立的算术运算或逻辑运算操作(如加减移位等)。 一台计算机中所有机器指令的集合指令集。它存在于CPU内部,对CPU运算进行指导和优化。 从指令集来说,计算机分为我们熟悉的 CISC(复杂指令集计算机)和 RISC(精简指令集计算机)。这两种的设计理念和优缺点各不相同,这里不再展开。 微架构 微架构,是处理器核心的实现方式,是 将一种给定的指令集架构在处理器中执行的方法(指令集的实现)。 通常认为只有具备独立的微架构研发能力的企业才算具备了CPU研发能力。 指令集架构(处理器架构) 是计算机体系结构中与程序设计有关的部分,包含了基本数据类型,指令集,寄存器,寻址模式,存储体系,中断,异常处理以及外部I/O。指令集架构为汇编语言的设计师和编译器所见。 几种常见的架构(详细内容和异同网上的介绍很多) x86 的32位 -> IA32

汇编命令笔记

安稳与你 提交于 2020-01-06 14:36:36
汇编命令笔记 JL(jl) 汇编语言中条件转移语句:JL/JNGE, 用于有符号数的条件转移指令,小于\不大于且不等于转移;ZF=0,且SF⊕OF=1。 汇编程序设计中jl是一个条件跳转指令,全名jump less,意为小于跳转,有符号数比较类似的还有还有jg、ja、jb等jg jump great 大于跳转,有符号数比较ja above 大于,无符号数比较jb below 小于,无符号数比较条件跳转根据的是标志位,条件跳转语句前面一般都有一些对标志位有影响的语句,如cmp ,test ,sub等 笔记来源 JZ(jz) ZF汇编语言中的PSW标志寄存器中的一位,而JZ则是根据ZF决定是否跳转。若ZF=1(表示本次运算结果为0,不为0则ZF=0),则跳转,否则,不跳转ZF的状态根据其他指令的执行结果设置。 jz=jump if zero,即零标志为1就跳转,一般与cmp连用,用以判断两数是否相等 jz的另一种写法就是je,je=jump if equal,jz和je的作用是完全一样的 JZ是累加器A判零条件转移指令. JZ rel ;若A=0,则PC+2+rel—>PC;否则,PC+2—>PC(rel : 以补码形式表示的8位地址偏移量,其值为-128~+127) 笔记来源 TEST(test) TEST 指令在两个操作数的对应位之间进行 AND 操作,并根据运算结果设置符号标志位

内嵌汇编

[亡魂溺海] 提交于 2020-01-05 09:58:01
参考1、AT&T汇编语言与GCC内嵌汇编简介 2、 Professional.Assembly.Language十三章 ARM GCC 内嵌(inline)汇编手册 内嵌汇编语法如下: __asm__ __volatile__ ( 汇编语句模板: 输出部分: 输入部分: 破坏描述部分 );   汇编语句模板由汇编语句序列组成, 语句之间使用“;”、“\n”或“\n\t”分开 。指令中的操作数可以使用占位符引用C语言变量,操作数占位符最多10个,名称如下:%0,%1…,%9。指令中使用占位符表示的操作数,总被视为long型(4个字节),但对其施加的操作根据指令可以是字或者字节,当把操作数当作字或者字节使用时,默认为低字或者低字节。对字节操作可以显式的指明是低字节还是次字节。方法是在%和序号之间插入一个字母,“b”代表低字节,“h”代表高字节,例如:%h1。 “__asm__” 表示后面的代码为内嵌汇编,“asm”是“__asm__”的别名。 “__volatile__” 表示编译器不要优化代码,后面的指令保留原样,“volatile”是它的别名。括号里面是汇编指令   C语言关键字volatile(注意它是用来修饰变量而不是上面介绍的__volatile__)表明某个变量的值可能在外部被改变,因此对这些变量的存取不能缓存到寄存器,每次使用时需要重新存取。该关键字在多线程环境下经常使用

汇编语言---GCC内联汇编

我怕爱的太早我们不能终老 提交于 2020-01-05 09:57:48
GCC支持在C/C++代码中嵌入汇编代码,这些代码被称作是"GCC Inline ASM"(GCC内联汇编); 一、基本内联汇编 GCC中基本的内联汇编非常易懂, 格式如下 : __asm__ [__volatile__] ("instruction list"); 其中, 1.__asm__ : 它是GCC定义的关键字 asm 的宏定义(#define __asm__ asm),它用来声明一个内联汇编表达式,所以,任何一个内联汇编表达式都以它开头,它是必不可少的;如果要编写符合ANSI C标准的代码(即:与ANSI C兼容),那就要使用__asm__; 2.__volatile__ : 它是GCC关键字 volatile 的宏定义;这个选项是可选的;它向GCC声明"不要动我所写的instruction list,我需要原封不动地保留每一条指令";如果不使用__volatile__,则当你使用了优化选项-O进行优化编译时,GCC将会根据自己的判断来决定是否将这个内联汇编表达式中的指令优化掉;如果要编写符合ANSI C标准的代码(即:与ANSI C兼容),那就要使用__volatile__; 3.instruction list : 它是汇编指令列表;它可以是空列表,比如:__asm__ __volatile__("");或__asm__("");都是合法的内联汇编表达式

【转贴】GCC 内联汇编

坚强是说给别人听的谎言 提交于 2020-01-05 09:56:10
1. 简介 1.1 版权许可 Copyright (C) 2003 Sandeep S. 本文档自由共享;你可以重新发布它,并且/或者在遵循自由软件基金会发布的 GNU 通用公共许可证下修改它;也可以是该许可证的版本 2 或者(按照你的需求)更晚的版本。 发布这篇文档是希望它能够帮助别人,但是没有任何担保;甚至不包括可售性和适用于任何特定目的的担保。关于更详细的信息,可以查看 GNU 通用许可证。 1.2 反馈校正 请将反馈和批评一起提交给 Sandeep.S。我将感谢任何一个指出本文档中错误和不准确之处的人;一被告知,我会马上改正它们。 1.3 致谢 我对提供如此棒的特性的 GNU 人们表示真诚的感谢。感谢 Mr.Pramode C E 所做的所有帮助。感谢在 Govt Engineering College 和 Trichur 的朋友们的精神支持和合作,尤其是 Nisha Kurur 和 Sakeeb S 。 感谢在 Gvot Engineering College 和 Trichur 的老师们的合作。 另外,感谢 Phillip , Brennan Underwood 和 colin@nyx.net ;这里的许多东西都厚颜地直接取自他们的工作成果。 2. 概览 在这里,我们将学习 GCC 内联汇编。这里内联表示的是什么呢?