厦门网站建设公司哪家好,宽屏网站,哈尔滨网络公司资讯,阿里云域名续费寄存器1、什么是寄存器2、寄存器分类3、windows X86寄存器命名规则4、寄存器相关术语5、寄存器分类5.1、RAX(accumulator register)5.2、RBX(Base register)5.3、RDX(Data register)5.4、RCX(counter register)5.5、RSI(Source index)5.6、RDI(Destination index)5.7、RSP(stac…
寄存器1、什么是寄存器2、寄存器分类3、windows X86寄存器命名规则4、寄存器相关术语5、寄存器分类5.1、RAX(accumulator register)5.2、RBX(Base register)5.3、RDX(Data register)5.4、RCX(counter register)5.5、RSI(Source index)5.6、RDI(Destination index)5.7、RSP(stack pointer)5.8、RBP(Base pointer)5.9、RIP(instruction pointer)6、普通寄存器6.1、R8~R156.2、YMM0~157、特别说明8、汇编指令8.1、数据格式8.2操作数格式寻址方式8.3汇编指令8.3.1数据传送指令8.3.2压入和弹出栈数据8.3.3算术和逻辑操作8.3.4控制指令本篇博客是栈-寄存器和函数状态专题第一篇文章主要解释计算机中寄存器相关知识技术下面的分析我们都是基于下面这张图。重点 %ebp 和 %esp栈是从高地址向低地址延伸的。每个函数的每次调用都有它自己独立的一个栈帧%esp总是指向当前栈帧的顶部(低地址)而%ebp通常指向当前栈帧的底部(高地址)用于在栈帧中寻址
1、什么是寄存器
寄存器实际上知识存储数据的地方只不过它集成在CPU里访问寄存器的速度比访问内存更快而内存的访问速度比硬盘更快。
2、寄存器分类
由于寄存器属于底层基础设施贴近硬件因此在不同体系结构和操作系统上寄存器使用方式各异但是基本上可以分为特殊功能寄存器和普通寄存器特殊功能寄存器一般用于特定的功能而普通寄存器可以随意使用。
3、windows X86寄存器命名规则
前缀R表示64位寄存器。例如RAX前缀E表示32位寄存器。例如EAX后缀L表示寄存器的低8位。后缀H表示寄存器的9~16位
4、寄存器相关术语
byte字节单位表示8位二进制是计算机的最小存储单元WORD字。一个字通常是指两个字节16位针对windows X64平台这个规则总是成立的其他一些小众的平台不一定满足这一点。DWORDwindows API的类型用于表示“double world”的数据即32位。QWORDwindows API的类型用于表示“qual word”的数据即63位。x86_x64这是intel最先推出的指令集栈帧用于记录程序在某时刻栈的状态例如在调用一个函数之前需要保存栈帧用于在完成调用之后恢复现场。
5、寄存器分类
特殊功能寄存器分为通用寄存器索引寄存器。我们以64位寄存器为例介绍 ---------------------------------------------------------------下面介绍通用寄存器------------------------------------- 通用功能寄存器主要有四种即 【AXBXCXDX】 细节方面AXBXCXDX可以再往下划分 AXAccumlator Register)累加寄存器它主要用于输入/输出和大规模的指令运算 BX(Base Register)基址寄存器用来存储基础访问地址。 CX(Count Register)计数寄存器在迭代的操作中会循环计数。 DX(Data Register)数据寄存器它用于输入/输出操作它还与AX一起使用用于涉及大数值的乘法和除法运算。 这四种寄存器可以分为上半部分和下半部分。 【AX寄存器可以分为两个独立的 8位 AH 和 AL寄存器】 【BX寄存器可以分为两个独立的 8位 BH 和 BL寄存器】 【CX寄存器可以分为两个独立的 8位 CH 和 CL寄存器】 【DX寄存器可以分为两个独立的 8位 DH 和 DL寄存器】 AX的地位0-7位构成了 AL 寄存器高8位(8-15)位构成了AH寄存器。 在认识了寄存器之后我们通过一个示例看一下数据的具体存储方式。 比如数据 19 它在16 位存储器中所存储的表示如下 寄存器的存储方式先是存储 低位如果低位满足不了就存储高位如果低位能够满足高位就用0补全在其他低位也能满足的情况下其余位也用0补全。
-------------------------------------------------------索引寄存器--------------------------------------------------- 下面介绍索引寄存器
索引寄存器主要包含段地址的偏移量索引寄存器主要分为BP Base Pointer: 基础指针它是栈寄存器上的偏移量用来定位栈上的变量。SP Stack Point: 栈指针它是栈寄存器上的偏移量用来定位栈顶。SI Source Index:变址寄存器用来拷贝源字符串。DIDestination Index: 目标变址寄存器用来复制目标字符串。
------------------------------------------------控制寄存器---------------------------------------------------------- 下面介绍状态和控制寄存器 这两种寄存器是指令指针寄存器和 标志寄存器 IP Instruction Pointer指令指针寄存器它是从Code Segment代码寄存器处的偏移来存储执行的下一条指令。 FLAGFLAG寄存器用于存储当前进程的状态这些状态有
位置Direction用于数据块的传输方向是向上传输还是向下传输中断标志位(Interrupt) 1–允许0 --禁止陷入位(Trap) 确定每条指令执行完成后CPU是否应该停止。1–开启0—关闭进位(Carry) 设置最后一个无符号算术是否带有进位溢出(Overflow) 设置最后一个由符号的运算是否溢出符号(Sign) 如果最后一次算术运算为负则设置 1 —负 0 —正零位(Zero) 如果最后一次算术运算结果为零 1–零辅助进位Aux Carry: 用于第三位到第四位的进位奇偶校验 (Parity)用于奇偶校验
5.1、RAX(accumulator register) accumulator register 累加寄存器通常用于存储函数的返回值它主要用于输入/输出和大规模的指令运算AX 寄存器可以说是使用频率最高的寄存器。 也可以用于存储其他值只是通过RAX存储函数返回值属于惯例。 上图我们可以看到这个寄存器分为8个字节每个字节8位RAX是64位寄存器的称呼。 但是这个寄存器是可以拆分的例如我们操作EAX就是在对RAX的低32位进行操作。 同样类推 AX表示RAX的低16位 AH表示RAX低16位中的高8位 AL表示RAX低16位中的低8位 除了了 RIP之外其余的寄存器都可以做类似的拆分。 举例
mov ax,20 /* 将数字20存入寄存器 AX中*/
mov ah,80 /* 将数字80 存入寄存器 AX中的 AH(高位寄存器)中*/
mov al,10 /* 将数字10 存入寄存器 AX中的 AL(低位寄存器)中*/5.2、RBX(Base register)
base register 基址寄存器一般用于访问内存的基址 BX也被称为数据寄存器即表明其能够暂存一般数据同样也可以将BX当做两个独立的 8位寄存器使用即 BH 和BL BX除了具有暂存数据的功能之外还用于寻址即寻找物理地址这就是为什么也有人将其称为基址寄存器那么它存放的数据一般就用来作为偏移地址使用因为偏移地址是相对于基址地址上的偏移。
5.3、RDX(Data register)
DX也是数据寄存器能够暂存一般性数据。
5.4、RCX(counter register)
counter register计数寄存器。一般用于循环计数。
也可以称为数据寄存器能够暂存一般性数据可以分为CH 和CL它也有专门功能即计数器功能当汇编指令使用 循环LOOP时可以通过 CX来指定需要循环的次数每次执行循环LOOP时间CPU会做两件事 一件事是计数器自动减1 另一件事是判断CX中的值如果CX中的值为0则跳出循环继续执行循环下面的指令如果CX中的值不为0则会继续执行循环中所指定的指令。
--------------------------------------索引寄存器--------------------------------------------------------------------
5.5、RSI(Source index)
source index : 源变址寄存器字符串运算时常应用于源指针
5.6、RDI(Destination index)
destination index 目标变址寄存器字符串运算时常用于目标指针。
5.7、RSP(stack pointer)
stack Pointer 栈指针寄存器正常情况下存放栈顶地址如果用于其他事务使用完成之后需要恢复原先的数据
5.8、RBP(Base pointer)
base pointer 基址寄存器正常情况用于访问栈底地址与RBP功能类似如果用于其他事务使用完成之后需要恢复原先的数据
---------------------------------------控制寄存器--------------------------------------------------------------
5.9、RIP(instruction pointer)
instruction pointer 指令指针只读且不可拆分指向下一条需要执行指令的地址
6、普通寄存器
6.1、R8~R15
R8R9, R10…R15属于普通寄存器一般是可以任意使用的不指定特定用途支持拆分拆分规则与特殊功能寄存器有所不同。 32位拆分寄存器以 D作为后缀(DWORD)16位寄存器以 W作为后缀 (WORD)8位则以 B作为后缀 (BYTE)。 6.2、YMM0~15
YMM015专门用于存储浮点数包括float和double。单个寄存器可以存放多个浮点数。例如YMM#支持存放四个64位数值或者8个32位值。支持拆分成XMM015。
7、特别说明
RSP RBP最好只用作常规用途。如果另作他用使用完之后应该恢复原来的数据因为这两个寄存器包含栈帧信息这对程序非常重要。一般的寄存器只能存放一个值但是XMM和YMM寄存器可以看作是数组它们可以存放多个浮点数。
8、汇编指令
8.1、数据格式
intel数据类型汇编代码后缀字节b字(2字节)w双字(4字节)l四字(8字节)q单精度(4字节)s双精度(8字节)l1 Intel使用 字(word)表示 16位数据类型 2汇编指令除了要指明操作对象还要指明操作对象的数据类型和长度所以为指明操作对象的数据类型和长度可以在指令后面加上表示数据类型的后缀如movl 和 movq 分别表示操作对象为双字和四字。 但是操作长度也可以通过寄存器给出如eax表示 32位rax 表示64位 8.2操作数格式寻址方式 8.3汇编指令
8.3.1数据传送指令 ------------------------ 数据传送指令举例-----------------------
move 数据传递指令目的操作数不能是立即数数据不能从内存直接传送到内存(如一定需要转化成2条指令从内存取数据到寄存器然后从寄存器到内存) move $4, 17(%rsp) : 把数据4 存储到 17(%rsp)所在内存的地址值里。leaload effective address其实是mov的变形它的源操作数看上去是一个内存引用但并非从指定位置读入数据而是将有效地址写入到目的操作数目的操作时只能为寄存器。 lea17(%rsp), %rax 把17(%rsp)的内存地址的值写入到 %rax寄存器中。
8.3.2压入和弹出栈数据
这两个操作都会修改 %rsp的值
8.3.3算术和逻辑操作
注意ADD S,D 由四条加法指令组成即 addb, addw, addl 和 addq其他指令也是如此 Intel把16字节的数称为八字(oct word)。下面是一些特殊的指令
8.3.4控制指令
-----------------------------------------条件码---------------------------------
CPU维护着一组单个位的条件码寄存器它们描述了最近的算数或者逻辑操作的属性可以检查这些寄存器来执行条件分支指令。最常用的条件码有 CF进位标志最近的操作使最高位产生了进位可用于检查无符号操作的溢出。 ZF零标志最近的操作得出的结果为0。 SF符号标志最近的操作得到的结果为负数 。 OF溢出标志最近的操作导致一个补码溢出正溢出获负溢出。
算术和逻辑操作列出的指令中除了leaq其他指令都会修改条件码寄存器。 除了算数和逻辑操作指令可以改变条件码寄存器下面的指令也可以改变:
-----------------------------------------访问条件码---------------------------- 条件码通常不会直接读取常用的使用方法有三种。
更具条件码的某种组合将一个字节设置为0或者1根据条件码进行跳转有条件地传送数据 -----------------------------------------跳转指令---------------------------- --------------------------------条件传送指令---------------------------- --------------------------------转移控制----------------------------