指令寄存器

关于内存单元的一些想法

﹥>﹥吖頭↗ 提交于 2019-11-28 13:20:39
最近换工作,CPU的物理设计physical design,PR阶段有点懵,icache,dcache,tlb,mmu,decode等等,巧的是最近看了下操作系统的cpu介绍,颇有些互相印证的关系,对于上述的icache,dcache,最初以为i代表输入,其实i代表instruction,d代表data 关键术语 PC:程序计数器,存放下个执行的指令地址 AC:累加器 IR:指令寄存器 MAR:内存地址寄存器 MBR:内存缓冲寄存器 I/O AR:I/O地址寄存器 I/O BR:I/O缓冲寄存器 CPU运算 以简单地2+3=5为例,譬如2的内存地址为200,3的内存地址为204,最后结果写入2的地址上,这个过程涉及三步: 把2放到AC上,AC=2 把3加到AC上,AC=AC+3=5 把AC的值输出,AC>2 假设有一个32位的cpu,指令肯定是32位,指令由两个域组成,第一个字节存放操作码,第二个存放操作数地址,操作码如下 0001==1:代表将数据从内存中加载到AC上 0101==5:代表从内存加到AC 0010==2: 代表AC存到内存中 对于指令运算分为两部分,取指和执行,指令最初放在内存中100位置,以字节为显示单位,32位格式:字节 - 字节 - 字节 - 字节 内存地址 数据数据 0 0 0 100 1 0 0 200 0 0 0 104 5 0 0 204 0 0 0

JVM(十二):方法调用

早过忘川 提交于 2019-11-28 10:34:25
JVM(十二):方法调用 在 JVM(七):JVM内存结构 中,我们说到了方法执行在何种内存结构上执行:Java 方法活动在虚拟机栈中的栈帧上,栈帧的具体结构在内存结构中已经详细讲解过了,下面就让我们来看一下 方法是如何调用的 。 方法调用 首先,我们要明白一个基础性概念:方法调用并不是方法执行。其只是确定该调用哪一个方法而已(多态的影响,选择方法的不同版本)。并且因为 Java 调用的动态性,有些方法需要在类加载阶段动态解析,这也为 JVM 解析符号引用成直接引用提供了难度。 解析 在 JVM(五):探究类加载过程-上 中,我们说过在类加载过程的解析阶段, JVM 会将符号引用转变为直接引用。但这需要方法在程序真正运行的之前就有一个 可确定 的版本,且这个版本在整个运行期间是不可更改的。这种在类加载阶段就能解析出的方法调用被称为 解析 。 解析条件 满足解析条件的方法在 Java 语言中有 静态方法 和 私有方法 两类。前者与类类型直接关联,后者在外部无法被访问。这种特性也使得其不可能通过继承或别的方式来重写其版本,因此适合在解析阶段就进行处理。 在 JVM 内部与之相对应的就是 invokestatic 和 invokespecial 两种字节码指令。这两种指令对应的就是 调用静态方法 、 调用实例构造器 、 私有方法 、 父类方法 。 在执行这四类方法时

EFLAGS寄存器(标志寄存器)

為{幸葍}努か 提交于 2019-11-28 06:37:41
  由于最近公司项目到了收尾阶段,一直说要写博的我耽搁了好久,因为近期一直加班,回来后我也有自己的东西要去学,博客就耽搁了!   我还是想废话说一点,也不算吐槽,因为上阵子有个项目计算文件大小的例子,跟公司弄java的聊了一下,我说大小的判断为什么要用数字,而不去用移位运算来代替呢,移位不更加客观,可阅读吗?1 << 30位代表1GB,1 << 20代表1MB,1 << 10代表1KB,然后同事就说没必要,有API可以调用直接计算出文件的大小,话题到这,我就没接着讲了。诚然,高级语言API的调用极大便利了程序开发效率,另一方面我也觉得人像一个机器一样在那干活,没啥意思。本文讲述的EFLAGS寄存器(标志寄存器)是X86的内容,如果读者您觉得没必要或者也是认为API调用更加方便,那么我觉得您没有接着往下阅读的必要了。   既然被称作一声IT工程师,我觉得我们有必要去敬重一下自己的这个职位,或许是我个人原因吧,我始终觉得拿着计算器算3 × 3 = 9(举例而已),而不知道 3 × 3为什么等于9,就像API的调用,不知道事物的本质,很显然,大家都会知道 3 × 3是3个3相加,为了便于计算,人们发明了“×”(乘法)。编程犹如同数学,底子不好就注定上层质量,发展前景定然会受限。例子举得不好,废话也不多说了,知之者知之!!!   另外,这篇文章不是从0开始的

缓冲区溢出实例(一)--Windows

不羁的心 提交于 2019-11-28 06:16:38
一、基本概念 缓冲区溢出:当缓冲区边界限制不严格时,由于变量传入畸形数据或程序运行错误,导致缓冲区被填满从而覆盖了相邻内存区域的数据。可以修改内存数据,造成进程劫持,执行恶意代码,获取服务器控制权限等。 在Windows XP或2k3 server中的SLMail 5.5.0 Mail Server程序的POP3 PASS命令存在缓冲区溢出漏洞,无需身份验证实现远程代码执行。 注意,Win7以上系统的防范机制可有效防止该缓冲区漏洞的利用: DEP:阻止代码从数据页被执行; ASLR:随机内存地址加载执行程序和DLL,每次重启地址变化。 二、实验环境准备: SLMail 5.5.0 Mail Server ImmunityDebugger_1_85_setup.exe mona.py 下载地址: https://slmail.software.informer.com/download/ https://www.softpedia.com/get/Programming/Debuggers-Decompilers-Dissasemblers/Immunity-Debugger.shtml https://github.com/corelan/mona mona手册 https://www.corelan.be/index.php/2011/07/14/mona-py-the

STM32内部FLASH介绍

China☆狼群 提交于 2019-11-28 04:51:52
一、介绍 首先我们需要了解一个内存映射: stm32的flash地址起始于0x0800 0000,结束地址是0x0800 0000加上芯片实际的flash大小,不同的芯片flash大小不同。 RAM起始地址是0x2000 0000,结束地址是0x2000 0000加上芯片的RAM大小。不同的芯片RAM也不同。 Flash中的内容一般用来存储代码和一些定义为const的数据,断电不丢失, RAM可以理解为内存,用来存储代码运行时的数据,变量等等。掉电数据丢失。 STM32将外设等都映射为地址的形式,对地址的操作就是对外设的操作。 stm32的外设地址从0x4000 0000开始,可以看到在库文件中,是通过基于0x4000 0000地址的偏移量来操作寄存器以及外设的。 一般情况下,程序文件是从 0x0800 0000 地址写入,这个是STM32开始执行的地方,0x0800 0004是STM32的中断向量表的起始地址。 在使用keil进行编写程序时,其编程地址的设置一般是这样的: 程序的写入地址从0x08000000(数好零的个数)开始的,其大小为0x80000也就是512K的空间,换句话说就是告诉编译器flash的空间是从0x08000000-0x08080000,RAM的地址从0x20000000开始,大小为0x10000也就是64K的RAM。这与STM32的内存地址映射关系是对应的

汇编基础知识

邮差的信 提交于 2019-11-27 23:46:34
************************************************************************************************** 寄存器 ************************************************************************************************** 1. 通用寄存器   通用寄存器包括了8个16/32位的寄存器:AX/EAX、BX/EBX、CX/ECX、DX/EDX、SP/ESP、BP/EBP、DI/EDI及SI/ESI。其中AX/EAX、BX/EBX、CX/ECX、DX/EDX在一般情况下作为通用的数据寄存器,用来暂时存放计算过程中所用到的操作数、结果或其他信息。它们还可分为两个独立的8位寄存器使用,命名为AL、AH、BL、BH、CL、CH、DL和DH。这4个通用数据寄存器除通用功能外,还有如下专门用途:   AX/EAX作为累加器用,所以它是算术运算的主要寄存器。在乘除指令中指定用来存放操作数。另外,所有的I/O指令都使用AX或AL与外部设备传送信息。   BX/EBX在计算存储器地址时,可作为基址寄存器使用。   CX/ECX常用来保存计数值,如在移位指令、循环指令和串处理指令中用作隐含的计数器。DX在作双字长运算时

[汇编]汇编学习笔记(2):EBP寻址

徘徊边缘 提交于 2019-11-27 13:40:45
刚看到ESP寻址和EBP寻址,个人理解其实2个寻址都是差不多的,都是利用偏移量来获取参数,一个搞懂另一个也明白了。只要记住ESP寻址有缺陷就OK了,缺陷就是在函数中使用push后会导致ESP一直在变,不好计算传入参数的地址而已。多写写就能记住。 练习:写个3数相加的函数。在敲代码之前,先画张图,理清下思路: 1.第一张图完成了计算,并将结果存入EAX寄存器中。说明下,图中的X地址只是用于做标示的,管它是多少来着。图上最后一张框里的汇编代码写错了, 把ECX写成EBX了 ,害得后面写代码也写错了╮(﹀_﹀)╭,仔细调试才发现写错,截图截了好几次,好累。 2.第二张图完成了恢复工作,恢复堆栈平衡,ECX,EDX,EBP3个寄存器恢复之前缓存的值。 开始敲代码,代码就按照上面2张图写,ECX寄存器所存储的值为了方便观察改成了12345678: 第一张图只是记录初始值。 第2张图,执行完call指令,观察堆栈里的值和ESP寄存器 第3张图执行完函数中的push指令,缓存了3个寄存器的值,并将ESP寄存器的值赋给EBP寄存器 第4张图,执行完了加法,并得到结果6,函数主要的功能完成, 最后一张图,几个pop指令加上retn指令恢复了堆栈平衡,和寄存器之前存储的值。变化就是栈顶上面有使用过的地址,提醒自己局部变量需要初始化。 来源: https://blog.csdn.net

实时时钟芯片DS1302

我与影子孤独终老i 提交于 2019-11-27 08:06:29
BCD码 用0b0000-0b1001表示0-9 0b1001加1自动进位为0b00010000 特性 1、DS1302是一个实时时钟芯片,可以提供秒、分、小时、日期、月、年等信息,并且还有软件自动调整的能力,可以通过配置AM/PM来决定采用24小时格式还是12小时格式。 2、拥有31字节数据存储RAM。 3、串行I/O通信方式,相对并行来说比较节省IO口的使用。 4、DS1302的工作电压比较宽,在2.0~5.5V的范围内都可以正常工作。 5、DS1302这种时钟芯片功耗一般都很低,它在工作电压2.0V的时候,工作电流小于300nA。 6、DS1302共有8个引脚,有两种封装形式,一种是DIP-8封装,芯片宽度(不含引脚)是300mil,一种是SOP-8封装,有两种宽度,一种是150mil,一种是208mil。 7、当供电电压是5V的时候,兼容标准的TTL电平标准,这里的意思是,可以完美的和单片机进行通信。 8、由于DS1302是DS1202的升级版本,所以所有的功能都兼容DS1202。此外DS1302有两个电源输入,一个是主电源,另外一个是备用电源,比如可以用电池或者大电容,这样做是为了在系统掉电的情况下,我们的时钟还会继续走。 硬件信息 引脚功能 寄存器介绍 寄存器内部采用BCD码 指令讲解: DS1302 的一条指令一个字节共 8 位,其中第 7 位(即最高位)固定为 1

重学计算机组成原理(五)- \"旋转跳跃\"的指令实现

不问归期 提交于 2019-11-27 06:21:06
CPU执行的也不只是一条指令,一般一个程序包含很多条指令 因为有if…else、for这样的条件和循环存在,这些指令也不会一路平直执行下去。 一个计算机程序是怎么被分解成一条条指令来执行的呢 1 CPU如何执行指令 CPU里差不多几百亿个晶体管 实际上,一条条计算机指令执行起来非常复杂 好在CPU在软件层面已经为我们做好了封装 对于程序员来说,我们只要知道,写好的代码变成了指令之后,是一条一条 顺序执行 不管几百亿的晶体管的背后是怎么通过电路运转起来的 逻辑上,我们可以认为,CPU其实就是由一堆寄存器组成的 而寄存器就是CPU内部,由多个触发器(Flip-Flop)或者锁存器(Latches)组成的简单电路。 触发器和锁存器,其实就是两种不同原理的数字电路组成的逻辑门 如果想要深入学习的话,可以学习数字电路的相关课程 N个触发器或者锁存器,就可以组成一个N位(Bit)的寄存器,能够保存N位的数据 比方说,我们用的64位Intel服务器,寄存器就是64位的 CPU里有很多种不同功能的 1.1 寄存器 寄存器(Register),是中央处理器内的其中组成部分。寄存器是有限存贮容量的高速存贮部件,它们可用来暂存指令、数据和地址。在中央处理器的控制部件中,包含的寄存器有指令寄存器(IR)和程序计数器。在中央处理器的算术及逻辑部件中,包含的寄存器有累加器。 在计算机体系结构里

64位下的InlineHook

妖精的绣舞 提交于 2019-11-26 23:06:54
目录 x64下手工HOOK的方法 一丶HOOK的几种方法之远跳 1. 远跳 不影响寄存器 + 15字节方法 2.远跳 影响寄存器 + 12字节方法 3.影响寄存器,恢复寄存器 进行跳转. 4. 常用 jmp + rip方式跳转 大小6个字节 二丶Call的几种方式. 1. CALL PUSH + RET 方式 2.正常call x64下手工HOOK的方法 关于64位程序.网上HOOK方法一大堆.这里也记录一下. 了解跨平台HOOK的真相与本质. 一丶HOOK的几种方法之远跳 1. 远跳 不影响寄存器 + 15字节方法 在64位下 HOOK有几种方法. 一种是影响寄存器的值.另一种是不影响寄存器的值.各有优劣. 第一种: 不影响寄存器的值 硬编码占用大小为15个字节. 原理: 利用push + ret的原理. 让HOOK的位置跳转为我们的地址. push 函数低地址(8个字节) mov qword ptr ss:[rsp + 4],函数高地址(8个字节,不过高4个字节一般都是0所以可以不用给) ret 硬编码: 68 XX XX XX XX push LowAddress 48 C7 44 24 04 XX XX XX XX mov qword ptr ss:[rsp + 4],HighAddress C3 ret 其中XX的地方可以换成我们的地址. 2.远跳 影响寄存器 +