汇编指令

汇编——第二章 寄存器

五迷三道 提交于 2020-03-09 18:42:44
第二章 寄存器 cpu的主要的部件是寄存器, 不同的cpu,寄存器的个数、结构是不相同的。 在8086cpu中有14个寄存器,这些寄存器是:AX、BX、CX、DX、SI、DI、SP、BP、IP、CS、SS、DS、ES、PSW。 IP:指令指针,指向当前相互要取出的指令字节,当BIU从内存中取出一个指令后,IP就自动加1, 这里的1指的不是一个字节,而是该条指令所占的字节数。 IP指向的是指令地址的段内地址偏移量,又称为 偏移地址(Offset Address) 或者 有效地址(A, Effective Address)。 CS:代码段寄存器 DS:数据段寄存器 SS:堆栈寄存器 ES:附加段寄存器 其他的寄存器会在后面相应的章节一一列出作用。 2.1 通用寄存器 8086CPU的所有寄存器都是16位的,可以存放俩个字节。 其中通用寄存器为AX、BX、CX、DX这四个。 这四个寄存器又可以分为8个单独的寄存器来使用,拿AX来说,可以分为高低俩个字节,名字分别为AH、AL。 虽说这四个寄存器都是通用寄存器,但是其都有独自的功能和特点。 AX:累加寄存器,通常用于运算,在乘除指令中指定用来存放操作数,另外,所有的I/O指令都使用这一寄存器与外界设备传输数据。 BX:基址寄存器,常用于地址索引。 CX:计数寄存器,常用于计数;常用于保存计算值,如位移指令,循环(loop

条件转移指令详解

故事扮演 提交于 2020-03-09 08:23:16
程序控制指令又称为控制转移指令,包括:转移指令、循环控制指令、过程调用指令和 中断指令 4 类。转移指令又分为无条件转移指令和条件转移指令。 1.无条件转移指令 JMP 计算机程序的执行完全按照 CS:IP 的指向执行指令。 通常情况下 CS 保持不变,IP 自动 增量,程序就按照指令的先后顺序执行。无条件转移指令会修改 CS 和 IP 的值,使程序跳 转到另一个位置去执行,改变指令的执行顺序。 根据程序的转移范围可分为段内转移和段间转移。 在同一段的范围之内进行转移,只需 要修改 IP 的值,称为段内转移。如果 CS 的值被修改,意味着程序将转移到另外的段去执行, 这称为段间转移。段间转移不仅修改段基址 CS 的值,还修改IP 的值。 JMP 指令不影响标志位。 1)段内转移 指令格式: JMP OPRD 功能:段内转移,IP IP+位移量,或给 IP 赋值。 说明:根据 OPRD 的类型又分为段内直接转移和段内间接转移。指令不影响标志位。 例如: JMP LABEL ,程序转移到 LABEL 指明的指令处继续执行。例如【例题 3-17】程序段中的 FOUND 和 DONE。 JMP SHORT LABEL ,程序转移到 LABEL指明的指令处继续执行。SHORT 为属性说明符, 说明转移范围,以当前 IP 为中心,转移范围-128~+127。 JMP NEAR LABEL

关于单CPU,多CPU上的原子操作

五迷三道 提交于 2020-03-09 04:19:06
所谓原子操作,就是"不可中断的一个或一系列操作" 。 硬件级的原子操作: 在单处理器系统(UniProcessor)中,能够在单条指令中完成的操作都可以认为是" 原子操作",因为中断只能发生于指令之间。这也是某些CPU指令系统中引入了test_and_set、test_and_clear等指令用于临界资源互斥的原因。 在对称多处理器(Symmetric Multi-Processor)结构中就不同了,由于系统中有多个处理器在独立地运行,即使能在单条指令中完成的操作也有可能受到干扰。 在x86 平台上,CPU提供了在指令执行期间对总线加锁的手段。CPU芯片上有一条引线#HLOCK pin,如果汇编语言的程序中在一条指令前面加上前缀"LOCK",经过汇编以后的机器代码就使CPU在执行这条指令的时候把#HLOCK pin的电位拉低,持续到这条指令结束时放开,从而把总线锁住,这样同一总线上别的CPU就暂时不能通过总线访问内存了,保证了这条指令在多处理器环境中的 原子性。 软件级的原子操作: 软件级的原子操作实现依赖于硬件原子操作的支持。 对于linux而言,内核提供了两组原子操作接口:一组是针对整数进行操作;另一组是针对单独的位进行操作。 2.1. 原子整数操作 针对整数的原子操作只能对atomic_t类型的数据处理。这里没有使用C语言的int类型,主要是因为: 1)

汇编

风流意气都作罢 提交于 2020-03-08 18:29:13
CPU有三条总线: 地址、数据、控制线 地址总线确定存储单元 控制总线发送指令 数据总线:传输数据 CPU N个地址线 地址总线宽度为N 可以寻找2^N个内存单元 *存储单元 0开始编号,一个存储单元可以存储一个Byte 8086CPU有16根地址线 1bit就是一根地址线 存储器以B为最小单位 ========================第二章 寄存器========================== 通用寄存器: AX BX CX DX AX ——> AH和AL 16位寄存器最大能存储的数 2^16 - 1 = 65536 - 1 转十六进制是四位 0~FFFFH 8 位寄存器 2^8 = 256 转十六进制 0~FFH 8086CPU在内部采用2个16位地址合成的方法来形成一个20位的物理地址 地址加法器: 物理地址 = 段地址 X 16 + 偏移地址 段地址 X 16 的说法是左移 4 位 一个X进制数左移1位,相当于乘以X 段地址 X 16 + 偏移地址 含义是: CPU 在访问内存时,用一个基础地址(段地址X16)和一个相对于基础地址的偏移地址相加,给出内存单元的物理地址。 起始、基础地址就是段地址 偏移地址16位,0~FFFFH, 64KB *课后题: (1) CPU寻址范围 (0001H+ 0000H x 16 ) ~ (0001H+FFFFH x 16 )

汇编实验报告五

大城市里の小女人 提交于 2020-03-07 08:54:10
(5) 一开始写的是两个循环的,结果发现C段里面没相加结果,反汇编发现,第二个循环部分的代码并没有执行,怎么改都不行,数量不多,就换成了直接一个一个入栈,结果那部分代码也不执行,我弄了一个多小时也找不出问题ORZ 后来又换了一种方法,才可以。 不可行1号:(mov ax,4c00h int21h 后来发现了,改了也不行) 不可行2号: 不可行3号: …… 可行的: (6) 1.感觉无论是什么段,都是我们自己定义的,本质就是一个内存空间,然后我们给他定义一个功能,就像ax寄存器一样,我们可以赋值可以通过它赋值给别的段。 2.8086 汇编中,逻辑段实际分配的空间是16 字节的整数倍。通过反汇编就可以看出每个段占了多少空间。就能知道各个段之间相差几。 3.如果不指名start入口,程序会顺序(从上至下)执行,如果是数据段,本来用来处理的数据会被当做指令代码,可能会影响原本code段指令对数据的处理,从而导致了错误的结果。 来源: https://www.cnblogs.com/zxy666/p/10201198.html

基本反汇编算法

♀尐吖头ヾ 提交于 2020-03-07 08:38:17
在机器码中 数据与代码都是相同的二进制数字,你无法判断那些数据是代码 那些数据是数据 反汇编文件都有自己的文件格式,window下的pe文件,liunx下的eldf文件,这些类型文件含有一种机制就可以用来确定文件中包含的代码和代码入口点,通常表现为层级文件头的形式 线性扫描反汇编 确定反汇编指令位置的方式:一条指令结束,另一条指令开示的地方 确定起始位置最为困难:扫描被程序文件标注为代码的节所包含的全部的机器指令,线性扫描完整个代码段 线性扫描并不会识别分支等非线性指令来了解程序的控制流 优点:完全覆盖程序的所有代码段 缺点:无法考虑到代码中混杂的数据 递归下降反汇编 强调控制流的概念:控制流根据一条指令是否被另一条指令引用来决定是否对其进行反汇编 根据指令对指针过的影响来分类: 顺序流:将执行权传递给紧随其后的下一条指令 条件分支:条件真假影响执行路径,若不跳装则以线性模式执行指令,并以线性模式扫描下一条汇编指令,但是在静态环境中是无返判断条件判的结果,因此递归下降会同时反汇编这两条指令,并将分支目标指令的地址添加到稍后才进行反汇编的地址列表,推迟它的反汇编过程 无条件分支:执行权传给一条指令,但这条指令可以在任何位置,然后也没啥理由反汇编紧跟在无条件分支后面的指令 函数调用指令: 来源: https://www.cnblogs.com/Alex3O/p/12432454

又能扯皮了!没内存了还能看片?

拥有回忆 提交于 2020-03-06 15:35:58
虚拟内存 尽管基址寄存器和变址寄存器用来创建地址空间的抽象,但是这有一个其他的问题需要解决: 管理软件的膨胀(managing bloatware) 。虽然内存的大小增长迅速,但是软件的大小增长的要比内存还要快。在 1980 年的时候,许多大学用一台 4 MB 的 VAX 计算机运行分时操作系统,供十几个用户同时运行。现在微软公司推荐的 64 位 Windows 8 系统至少需要 2 GB 内存,而许多多媒体的潮流则进一步推动了对内存的需求。 这一发展的结果是,需要运行的程序往往大到内存无法容纳,而且必然需要系统能够支持多个程序同时运行,即使内存可以满足其中单独一个程序的需求,但是从总体上来看内存仍然满足不了日益增长的软件的需求(感觉和xxx和xxx 的矛盾很相似)。而交换技术并不是一个很有效的方案,在一些中小应用程序尚可使用交换,如果应用程序过大,难道还要每次交换几 GB 的内存?这显然是不合适的,一个典型的 SATA 磁盘的峰值传输速度高达几百兆/秒,这意味着需要好几秒才能换出或者换入一个 1 GB 的程序。 SATA(Serial ATA)硬盘,又称串口硬盘,是未来 PC 机硬盘的趋势,已基本取代了传统的 PATA 硬盘。 那么还有没有一种有效的方式来应对呢?有,那就是使用 虚拟内存(virtual memory) ,虚拟内存的基本思想是,每个程序都有自己的地址空间

汇编语言指令英文全称

坚强是说给别人听的谎言 提交于 2020-03-02 17:05:40
1.通用数据传送指令 MOV----> move MOV dest,src;dest←src MOV指令把一个字节或字的操作数从源地址src传送至目的地址dest。 MOVSX---->extended move with sign data MOVZX---->extended move with zero data PUSH---->push POP---->pop 进栈出栈指令 PUSHA---->push all POPA---->pop all PUSHAD---->push all data POPAD---->pop all data BSWAP---->byte swap XCHG---->exchange 交换指令用来将源操作数和目的操作数内容交换,操作数可以是字、也可以是字节,可以在通用寄存器与通用寄存器或存储器之间对换数据,但不能在存储器与存储器之间对换数据。 mov ax,1234h ;ax=1234h mov bx,5678h ;bx=5678h xchg ax,bx ;ax=5678h,bx=1234h xchg ah,al ;ax=7856h CMPXCHG---->compare and change XADD---->exchange and add XLAT---->translate 换码指令用于将BX指定的缓冲区中

对于流程优化的处理器架构

佐手、 提交于 2020-03-02 15:40:46
在过去的两年里,我学到了很多的代码优化方法的同事,在此汇总了什么。 优化处理器架构可以从下面几个方向展开:高速缓存命中。指令预测。数据预取,数据对齐,内存拷贝优化,ddr访问延迟。硬件内存管理优化,指令优化。叙述工具。 缓存未命中是处理器的主要性能瓶颈之中的一个。在FSL的powerpc上,訪问一级缓存是3个时钟周期,二级是12个,3级30多个。内存100个以上。一级缓存和内存訪问速度差30多倍。 我们能够算一下,假设仅仅有一级缓存和内存,100条存取指令。100%命中和95%命中。前者300周期,后者95*3+5*100=785周期,差了1.6倍。这个结果的前提是powerpc上每一个核心仅仅有1个存取单元,使得多发射也无法让存取指令更快完毕。 当然,假设未命中的指令分布的好,其中穿插了非常多别的非存取指令那就能够利用乱序多做些事情,提高效率。 怎么用代码提高缓存命中率?我们能够用指令预測和数据预取。 指令预測非经常见,处理器预測将要运行的一个分支,把兴许指令取出来先运行。 等真正确定推断条件的时候,假设预測对了,提交结果。假设不正确,丢掉预先运行的结果。又一次抓取指令。 此时,结果还是正确的,可是性能会损失。 有一个经常使用的指令预測机制叫btb(branch target buffer),大致方法是,对于跳转指令,把它近期几次的跳转结果记录下来

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虚拟机规范中都有详细定义,如怎么取操作数