汇编笔记之80x86寄存器组
本帖最后由 云野 于 2017-7-10 20:06 编辑经过一段时间的学习、在踩了一些坑以后对很多东西更有体会了、就也想把它整理成笔记发到论坛上吧、希望这样可以督促自己。哦、对了、这里新人一枚~还望多多关照。{:10_297:}
80x86寄存器组
1.寄存器组分类:分为程序可见的寄存器与程序不可见的寄存器
程序可见的寄存器:在汇编语言程序设计中用到的寄存器,可以由指令来指定。在此又可分为“通用寄存器”、“专用寄存器”与“段寄存器”。
程序不可见的寄存器:一般应用程序设计中不用而由系统所用的寄存器。(CPU专用、如微程序中的AR地址寄存器、DR数据寄存器等)。
2.通用寄存器(8个):分为8位、16位、32位
注:通用寄存器均可通用、以下说明为其约定功能
累加器(EAX、AX、AH、AL):可通用、也在乘除等指令中指定用来存放操作数。所有的I/O指令都使用这一寄存器与外部设备传送信息。
基质变址寄存器(EBX、BX、BH、BL):在计算存储器地址时,经常用作基址寄存器。
计数寄存器(ECX、CX、XH、CL):常用来保存计数值、与REP、LOOP和移位指令有着不可描绘的基情关系、你懂得。
数据寄存器(EDX、DX、DH、DL):一般在作双字运算时DX和AX组合在一起存放一个双字长数,DX用来存放高位字,对某些I/O操作、DX可用来存放I/O的端口地址。
堆栈指针寄存器(ESP、SP):用来指向栈顶
基址指针寄存器(EBP、BP):可与SS联用确定“栈”中的单元
源变址寄存器(ESI、SI):可与DS联用确定数据段中单元
目的变址寄存器(EDI、DI):可与DS、ES联用
注意:变址寄存器SI、DI有自增、自减功能、也就是说在寻址完一次后地址自动增减、不可连续寻同一地址。之前有一个程序设计就是因为不知道变址寻址的这个问题连续用的变址寻址怎么调都错的、唔·····因为会变所以它叫变址?
3.专用寄存器(3个)16位/32位
指令指针寄存器(EIP/IP):存放即将运行的下一条指令的偏移地址,它与段寄存器CS联合确定代码段中指令的物理地址
堆栈指针寄存器(ESP/SP):哈哈哈、是不是觉得眼熟、好吧、它既是通用又是专用
标志寄存器(EFLAGS/FLAGS):又名“程序状态寄存器”,存放条件运行时的“条件码标志、控制标志、系统标志”(状态字)
条件码标志(6个):程序运行结果和状态信息,可作为程序转移与处理控制的条件
溢出标志OF:溢出时为1(OV),不溢出时为0(NV)
符号标志SF:标识结果正负,正为0(PL),负为1(NZ)
零标志ZF:结果是否为0,是为1(ZR),否为0(NZ)
半进位标志AF:运算时第3位是否发生进/借位,是为1(AC),否为0(NA)
奇偶标志PF:结果中的1的个数是否为偶,是为1(PE),否为0(PO)
进位标志CF:最高位是否发生进/借位,是为1(CY),否为0(NC)
控制标志(方向标记DF)DF=1则表明变址寄存器SI和DI递减,DF=0则表明变址寄存器SI和DI 递增
系统标志:用于I/O、中断屏蔽、程序调试、任务切换等;
主要有 TF:陷阱标志;IF:中断标志;IO:PLI/O特权标志等
4.段寄存器(4个/6个):专用于存储器寻址,用来直接或间接地存放段地址、都是16位
代码段CS、数据段DS、堆栈段CS、附加段ES、附加数据段(FS和GS)
一般情况下,各段在存储器中的分配是由操作系统负责的。每个段可以独立地占用64KB存储区,各段也允许重叠。若某一段超过64KB空间,则必须在程序中动态修改段寄存器的内存。
段寄存器与相应存放偏移地址的寄存器之间默认组合
段 偏移
CS IP
SS SP或BP
DS BX、DI、SI或一个16位数
ES DI(用于串指令)
注意:使用默认组合程序中不必专门指出其组合关系,若用到非默认组合关系,则必须使用段跨越前缀加以说明。
好了、关于寄存器就先写到这里、希望大家可以讲一讲自己关于寄存器以及寻址的思考、比如说开始我就想SP和BP都可以指向栈那他们的区别是什么呢?为什么要将存储器地址分段?一个段为什么最大占64KB呢等等之类的。{:10_264:}
页:
[1]