汇编语言学习笔记 第一节:寄存器

来源:互联网 发布:51单片机助手 编辑:程序博客网 时间:2024/06/05 11:10

       寄存器(英文register)是CPU内部用来暂存指令、数据、地址的元件。理解寄存器是理解计算机运行原理和掌握汇编语言的基础环节。

       从寄存器的用途来看,可分为数据寄存器(eax、ebx、ecx、edx)指针寄存器(esi、edi、ebp、esp、eip)段寄存器(cs、ss、ds、es、fs、gs)标志寄存器(eflags)等4类。

       一、数据寄存器

       数据寄存器主要用来保存操作数和运算结果等信息,从而节省读取操作数所需占用总线和访问存储器的时间。

       32位CPU有4个32位的数据寄存器:eaxebxecxedx

       eax通常称为累加寄存器(Accumulator),用累加器进行的操作可能需要更少时间。累加器可用于乘、除、输入/输出等操作,它们的使用频率很高;
       ebx称为基地址寄存器(Base Register)。常作为存储器指针来使用; 
       ecx称为计数寄存器(Count Register)。在循环和字符串操作时,要用它来控制循环次数;在位操作中,当移多位时,要用CL来指明移位的位数;
       edx称为数据寄存器(Data Register)。在进行乘、除运算时,它可作为默认的操作数参与运算,也可用于存放I/O的端口地址。

       相比16位寄存器,32位寄存器中的eaxebxecxedx不仅可传送数据、暂存数据保存算术逻辑运算结果,而且也可作为指针寄存器,因而更具有通用性。

       二、指针寄存器

       寄存器esi(s为source)、edi(d为destination)称为变址寄存器(Index Register),主要用于存放存储单元在段内的偏移量。

       寄存器ebpesp称为指针寄存器(Pointer Register),主要用于存放堆栈内存储单元的偏移量。

      ebp为基指针(Base Pointer)寄存器,用它可直接存取堆栈中的数据;

       esp为堆栈指针(Stack Pointer)寄存器,用它只可访问栈顶。

       用变址寄存器和指针寄存器可实现多种存储器操作数的寻址方式,为以不同的地址形式访问存储单元提供方便。

       eip(Instruction Pointer)同cs一同指向CPU即将执行的下一条指令的地址。不能够直接修改这个寄存器的值,修改它的唯一方法是跳转或分支指令。

       三、段寄存器

       cs (Code Segment):代码段寄存器;

       ds (Data Segment):数据段寄存器;

       ss (Stack Segment):栈段寄存器;

       es (Extra Segment):附加段寄存器;

       另外x86还有fs、gs两个附加段寄存器,与es相同。

       段寄存器存放某个段的基址,配合指针寄存器便能获取当前操作的位置。

       四、标志寄存器

       CF(Carry FLag) - 进位标志(第0位):进位标志是用来反映计算时是否产生了由低位向高位的进位,或者产生了从高位到低位的借位 。

    if(运算过程中产生了进位或者借位){ CF  =  1;}else{ CF  =  0;}

 

      PF(Parity FLag) - 奇偶标志(第2位):奇偶标志是用来记录相关指令执行后,其结果的所有的Bit位中1的个数是否为偶数 。

    if(运算结果中 1 的个数为偶数){ PF  =  1;}else{ PF  =  0;}

 

     AF(Auxiliary Carry FLag) - 辅助进位标志(第4位):用来辅助进位标志 。

    if(字节操作中发生低半个字节向高半个字节借位或者进位  ||  字操作中发生低字节向高字节借位或者进位){ AF = 1;}else{ AF = 0;}

 

     ZF(Zero FLag) – 零标志(第6位):记录的是相关的指令执行完毕后,其执行的结果是否为0。

if( 执行的结果== 0 ){ ZF = 1;}else{ ZF = 0;}

 

     SF(Sign FLag) - 符号标志(第7位):符号标志,其记录相关指令执行完以后,其结果是否为负数 。

    if( 运算结果为负数 ){ SF = 1; }else{ SF = 0;}

 

     TF(Trap FLag) - 追踪标志(第8位):追踪标志,主要是用于调试时使用 。

    if(TF  ==  1){ CPU 进入单步方式;}

 

     IF(Interrupt-Enable FLag) - 中断允许标志(第9位):中断允许标志,其决定  CPU  是否能够响应外部可屏蔽中断请求(以后会做详细介绍) 。

    if(IF  ==  1){ CPU 能够响应外部的可屏蔽中断请求;}else{ CPU 不能够响应外部的可屏蔽中断请求;}

 

     DF(Direction FLag) - 方向标志(第10位):方向标志,其用于在串处理指令中,用来控制每次操作后SI和DI是自增还是自减 。

    if(DF == 0){ SI++;DI++;}else{SI--;DI--;}

 

     OF(OverFlow FLag) - 溢出标志(第11位):溢出标志,其通常记录了有符号数运算的结果是否发生了溢出 。

    if(运算发生溢出){ OF  =  1;}else{ OF  =  0;}






0 0