汇编指令

初学 Delphi 嵌入汇编[30] - 寄存器表

旧街凉风 提交于 2020-01-05 09:55:56
类型 名称 二进制码 寄存器说明 多功能寄存器 AL 0 累加寄存器低八位 AH 100 累加寄存器低八位 AX 0 16 位累加寄存器 EAX 0 32 位累加寄存器 BL 11 基址寄存器低八位 BH 111 基址寄存器低八位 BX 11 16 位基址寄存器 EBX 11 32 位基址寄存器 CL 1 计数寄存器低八位 CH 101 计数寄存器低八位 CX 1 16 位计数寄存器 ECX 1 32 位计数寄存器 DL 10 数据寄存器低八位 DH 110 数据寄存器低八位 DX 10 16 位数据寄存器 EDX 10 32 位数据寄存器 指针寄存器 SP 100 16 位堆栈指针寄存器 ESP 100 32 位堆栈指针寄存器 BP 101 16位基址指针寄存器 EBP 101 32 位基址指针寄存器 变址寄存器 DI 111 16 位目标变址寄存器 EDI 111 32位目标变址寄存器 SI 110 16 位源变址寄存器 ESI 110 32位源变址寄存器 专用寄存器 IP * 16 位指令指针寄存器 EIP * 32 位指令指针寄存器 FLAGS * 16 位标志寄存器 EFLAGS * 32位标志寄存器 段寄存器 CS 1 代码段寄存器 DS 11 数据段寄存器 ES 0 附加段寄存器 SS 10 堆栈段寄存器 FS 100 标志段寄存器 GS 101 全局段寄存器

曹大谈内存重排

淺唱寂寞╮ 提交于 2020-01-05 03:38:18
目录 什么是内存重排 CPU 重排 编译器重排 为什么要内存重排 内存重排的底层原理 总结 参考资料 写这篇文章的原因很简单,公司内部的 Golang 社区组织了第一期分享,主讲嘉宾就是我们敬爱的曹大。这个必定是要去听的,只是曹大的讲题非常硬核,所以提前找他要了参考资料,花了 1 个小时提前预习,才不至于在正式分享的时候什么也不懂。当然了,这也是对自己和主讲者的尊重。所有的参考资料都在文章最后一部分,欢迎自行探索。 在我读曹大给我的中英文参考资料时,我发现英文的我能读懂,读中文却很费劲。经过对比,我发现,英文文章是由一个例子引入,循序渐进,逐步深入。跟着作者的脚步探索,非常有意思。而中文的博客上来就直奔主题,对于第一次接触的人非常不友好。 两者就像演绎法和归纳法区别。国内的教材通常是演绎法,也就是上来先讲各种概念、原理,再推出另一些定理,比较枯燥;国外的教材更喜欢由例子引入,步步深入,引人入胜。这里,不去评判孰孰劣。多看看一些英文原版材料,总是有益的。据我所知,曹大经常从亚马逊上购买英文书籍,这个侧面也可以反映曹大的水平高啊。据说英文书一般都很贵,可见曹大也是很有钱的。 所以啊,技术文章写好不容易,我也自省一下。 什么是内存重排 分两种,硬件和软件层面的,包括 CPU 重排、编译器重排。 CPU 重排 引用参考资料 【内存一致模型】 里的例子: 在两个线程里同时执行上面的代码,A

浅尝java内存模型(JMM)

情到浓时终转凉″ 提交于 2020-01-05 03:22:02
本文参考《深入理解虚拟机》一书 一.JMM中的主内存和工作内存 主内存:主要是存储线程要读取的数据,如实例字段、静态字段和数组元素,局部变量和形参不存储在主存。 工作内存:每一个线程都有自己的工作内存,工作内存存储从主存中copy的一份副本,线程只能操作工作内存中的数据,不能直接操作主存中的数据。不同线程之间也无法访问其它线程的工作内存变量线程间变量值传递需要通过主存来进。 内存间进行交互操作: 由上面的交互关系可知,关于主内存与工作内存之间的具体交互协议,即一个变量如何从主内存拷贝到工作内存、如何从工作内存同步到主内存之间的实现细节,Java内存模型定义了以下八种操作来完成: lock(锁定):作用于主内存的变量,把一个变量标识为一条线程独占状态。 unlock(解锁):作用于主内存变量,把一个处于锁定状态的变量释放出来,释放后的变量才可以被其他线程锁定。 read(读取):作用于主内存变量,把一个变量值从主内存传输到线程的工作内存中,以便随后的load动作使用 load(载入):作用于工作内存的变量,它把read操作从主内存中得到的变量值放入工作内存的变量副本中。 use(使用):作用于工作内存的变量,把工作内存中的一个变量值传递给执行引擎,每当虚拟机遇到一个需要使用变量的值的字节码指令时将会执行这个操作。 assign(赋值):作用于工作内存的变量

异常、中断、陷阱

。_饼干妹妹 提交于 2020-01-04 14:29:13
int 3 指令是常见的 断点中断,研究这个的时候发现个系统的一些机制有关。就研究了一下中断的分类,还有异常和陷阱。下面是我百度之后的一些总结: 中断的分类:外中断和内中断 根据系统对中断处理的需要,操作系统一般对中断进行分类并对不同的中断赋予不同的处理优先级,以便在不同的中断同时发生时,按轻重缓急进行处理。 根据中断源产生的条件,可把中断分为外中断和内中断。 外中断是指来自处理器和内存外部的中断,包括I/0设备发出的I/O中断、外部信号中断(例如用户键人ESC键)。各种定时器引起的时钟中断以及调试程序中设置的断点等引起的调试中断等。外中断在狭义上一般被称为中断。 内中断主要指在处理器和内存内部产生的中断。内中断一般称为陷阱(trap)或异常。它包括程序运算引起的各种错误,如地址非法、校验错、页面失效、存取访问控制错、算术操作溢出、数据格式非法、除数为零、非法指令、用户程序执行特权指令、分时系统中的时间片中断以及从用户态到核心态的切换等都是陷阱的例子。 为了按中断源的轻重缓急处理响应中断,操作系统为不同的中断赋予不同的优先级。各中断源的优先级在系统设计时给定,在系统运行时是固定的。而处理器的优先级则根据执行情况由系统程序动态设定。 除了在优先级的设置方面有区别之外, 中断和陷阱还有如下主要区别: 1、陷阱通常由处理器正在执行的现行指令引起,而中断则是由与现行指令无关的中断源引起的

volatile变量

一个人想着一个人 提交于 2020-01-04 02:53:53
一、volatile概述 volatile提醒编译器它后面所定义的变量随时都有可能改变,因此编译后的程序每次需要存储或读取这个变量的时候,都会直接从变量地址(内存)中读取数据。如果没有volatile关键字,则编译器可能优化读取和存储,可能暂时使用寄存器中的值,如果这个变量由别的程序更新了的话,将出现不一致的现象。下面举例说明。 volatile一般用于修饰多线程间被多个任务共享的变量和并行设备硬件寄存器等。 二、volatile使用案例 在DSP开发中,经常需要等待某个事件的触发,所以经常会写出这样的程序: 1 short flag; 2 void test() 3 { 4 do1(); 5 while(flag==0); 6 do2(); 7 } 这段程序等待内存变量flag的值变为1,之后才运行do2()。变量flag的值由别的程序更改,这个程序可能是某个硬件中断服务程序。例如:如果某个按钮按下的话,就会对DSP产生中断,在按键中断程序中修改flag为1,这样上面的程序就能够得以继续运行。但是,编译器并不知道flag的值会被别的程序修改,因此在它进行优化的时候,可能会把flag的值先读入某个寄存器,然后等待那个寄存器变为1。如果不幸进行了这样的优化,那么while循环就变成了死循环,因为寄存器的内容不可能被中断服务程序修改。为了让程序每次都读取真正flag变量的值

volatile 说明

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

dnf小小外挂外挂原理及使用

≯℡__Kan透↙ 提交于 2020-01-03 03:26:37
dnf小小外挂几乎所有的中都使用了鼠标来改变角色的位置和方向,玩家仅用一个小小的鼠 标,就可以使角色畅游天下。 那么,我们如何实现在没有玩家的参与下角色也可以自动行走呢。其实实现这个并不 难,仅仅几个Windows API函数就 可以搞定dnf小小外挂,让我们先来认识认识这些API函数。   (1) 模拟鼠标动作API函数mouse_event,它可以实现模拟鼠标按下和放开等动作。     VOID mouse_event(       DWORD dwFlags, // 鼠标动作标识。       DWORD dx, // 鼠标水平方向位置。       DWORD dy, // 鼠标垂直方向位置。       DWORD dwData, // 鼠标轮子转动的数量。       DWORD dwExtraInfo // 一个关联鼠标动作辅加信息。     );   其中,dwFlags表示了各种各样的鼠标动作和点击活动,它的常用取值如下:    MOUSEEVENTF_MOVE 表示模拟鼠标移动事件。    MOUSEEVENTF_LEFTDOWN 表示模拟按下鼠标左键。    MOUSEEVENTF_LEFTUP 表示模拟放开鼠标左键。    MOUSEEVENTF_RIGHTDOWN 表示模拟按下鼠标右键。    MOUSEEVENTF_RIGHTUP 表示模拟放开鼠标右键。

CS萌新的汇编学习之路02 Learning of Assembly Language

青春壹個敷衍的年華 提交于 2020-01-02 06:28:08
第二节课 寄存器 1. 寄存器的定义: 进行信息储存的器件,是CPU中程序员可以读写的部件,通过改变各种寄存器中的内容来实现对CPU的控制 2. 寄存器的种类: 本节课学习通用寄存器和段寄存器 2.1 通用寄存器 8086CPU中,所有的寄存器都是16位的,可以存放两个字节。AX,BX,CX,DX这四个寄存器通常用来存放一般性的数据,被称为通用寄存器。 8086CPU的上一代CPU中的寄存器都是8位的,为了保证兼容,AX,BX,CX,DX这四个寄存器都可以分为两个8位的小寄存器来用。8086CPU可以一次性处理字节和字,字节(byte)是8个bit组成;字(word)是由两个字节组成(高位字节和低位字节) 例如,AX分为AH和AL (高位和低位)AH为高8位,从00H到FFH,AL为低8位,从00H到FFH。两个按照AX=AH*100H+AL组合在一起。但是在对于AL、AH的单独运算中,产生进位是不予考虑的,比如单独对AL做加法,产生的进位不会加到AH里面,AH的进位也不予添加(超出AX范围了)。但是对于AX的计算考虑在AX范围内的进位,超出AX范围不考虑(直接舍去)。 2.2 物理地址和计算物理地址的方法 CPU访问内存单元,需要给出内存单元的地址,这个唯一的地址为物理地址。 8086CPU为16位结构的CPU机,意味着运算器一次性最多能处理16位的数据,寄存器的最大宽度为16

第二章寄存器

我只是一个虾纸丫 提交于 2020-01-02 06:22:04
第一章需要补充说明的是内存地址空间,对CPU来说,系统中的所有存储单元都处于一个统一的逻辑存储器中,它的容量受CPU寻址能力的限制,这个逻辑存储器就是我们所说的内存地址空间。这个概念比较抽象,需要进行一些编程实践增加更感性的认识。 在CPU中,有四种主要的部件。运算器,控制器,寄存器,内部总线。这里的内部总线用于CPU内部进行各种信息的传递,与第一章所讲的控制总线,数据总线,地址总线不同,第一章所描述的总线属于外部总线,作为CPU与外部期间进行信息传递的通路。运算器用于各种信息的处理,寄存器用于信息的处理,控制器用于控制信息的处理。对于利用汇编编程来说,寄存器是主要操作的部件,不同的CPU中寄存器的个数和种类是不同的。 8086CPU所有的寄存器都是16位的,可以存放两个字节,一个字节8位。AX、BX、CX、DX 通常用来存放一般性数据被称为通用寄存器。通用寄存器(重点)8086上一代CPU中的寄存器都是8位的,为保证兼容性,这四个寄存器都可以分为两个独立的8位寄存器使用。AX可以分为AH和AL;BX可以分为BH和BL;CX可以分为CH和CL; DX可以分为DH和DL。 AX的低8位(0位~7位)构成了AL寄存器,高8位(8位~15位)构成了AH寄存器。AH和AL寄存器是可以独立使用的8位寄存器,如果当成是8位寄存器使用,那么他们就是独立的,没有任何关系。

汇编语言第二章知识梳理及思考

蓝咒 提交于 2020-01-02 06:18:22
第二章 寄存器(CPU工作原理) CPU概述 CPU由运算器、控制器、寄存器等器件组成,这些器件靠内部总线相连。 内部总线实现CPU内部各个器件之间的联系。 外部总线实现CPU和主板上其他器件的联系。 寄存器概述 8086CPU有14个寄存器: AX、BX、CX、DX、SI、DI、SP、BP、IP、CS、SS、DS、ES、PSW。 2.1通用寄存器 8086CPU所有的寄存器都是16位的,可以存放两个字节。 通用寄存器:AX、BX、CX、DX通常用来存放一般性数据。 以AX为例,寄存器的逻辑结构: 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 16位数据在寄存器中的存放情况 数据:18 二进制表示:10010 在寄存器AX中的存储: 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0(AX) 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 一个16位的寄存器所能存储的数据的最大值为2^16-1 一个8位的寄存器所能存储的数据的最大值为2^8-1 为了保证兼容性,四个通用寄存器都可以分为两个独立的8位寄存器使用。 AX=AH(高8位(8~15位))+AL(低8位(0~7位)); BX=BH+BL; CX=CH+CL; DX=DH+DL; 2.2字在寄存器中的存储 一个字可存放在一个十六位的寄存器中