精华内容
下载资源
问答
  • i386中的状态和控制寄存器

    千次阅读 2014-03-12 08:28:08
    指令指针寄存器EIP中存放下一条将要执行指令的偏移量(offset )是相对于目前正在运行的代码段寄存器CS而言偏移量加上当前代码段的地址,就形成了下一条指令的地址。EIP中的低16位可以分开来进行访问,给它...

    状态和控制寄存器是由指令指针EIP、标志寄存器EFLAGS和4个控制寄存器(CR0~CR3)组成


    1. 指令指针寄存器和标志寄存器

    指令指针寄存器EIP中存放下一条将要执行指令的偏移量(offset )是相对于目前正在运行的代码段寄存器CS而言的。偏移量加上当前代码段的基地址,就形成了下一条指令的地址。EIP中的低16位可以分开来进行访问,给它起名叫指令指针IP寄存器,用于16位寻址。

    标志寄存器EFLAGS存放有关处理器的控制标志,如下图所示。


    点击看大图

    在这些标志位中,我们只介绍在Linux内核代码中常用且重要的几个标志位:

    第8位TF(Trap Flag)是自陷标志,当将其置1时则可以进行单步执行。当指令执行完后,就可能产生异常1的自陷(参看第四章)。也就是说,在程序的执行过程中,每执行完一条指令,都要由异常1处理程序 (在Linux内核中叫做debug())进行检验。当将第8位清0后,且将断点地址装入调试寄存器DR0~DR3时,才会产生异常1的自陷。                                  

    第12、13位IOPL是输入输出特权级位,这是保护模式下要使用的两个标志位。由于输入输出特权级标志共两位,它的取值范围只可能是0、1、2和3共4个值,恰好与输入输出特权级0~3级相对应。但Linux内核只使用了两个级别,即0和3级,0表示内核级,3表示用户级。在当前任务的特权级CPL(Current Privilege Level)高于或等于输入输出特权级时,就可以执行像IN、OUT、INS、OUTS、STI、CLI和LOCK等指令而不会产生异常13(即保护异常)。在当前任务特权级CPL为0时,POPF(从栈中弹出至标志位)指令和中断返回指令IRET可以改变IOPL字段的值。

    第9位IF(Interrupt Flag)是中断标志位,是用来表示允许或者禁止外部中断(参看第四章)。若第9位IF被置为1,则允许CPU接收外部中断请求信号;若将IF位清0,则表示禁止外部中断。在保护模式下,只有当第12、13位指出当前CPL为最高特权级时,才允许将新值置入标志寄存器EFLAGS以改变IF位的值。

    第10位DF(Direction Flag)是定向标志。DF位规定了在执行串操作的过程中,对源变址寄存器ESI或目标变址寄存器EDI是增值还是减值。如果DF为1,则寄存器减值;若DF为0,则寄存器值增加。

    第14位NT是嵌套任务标志位。在保护模式下常使用这个标志。当80386在发生中断和执行CALL指令时就有可能引起任务切换。若是由于中断或由于执行CALL指令而出现了任务切换,则将NT置为1。若没有任务切换,则将NT位清0。

    第17位VM (Virtual 8086 Mode Flag)是虚拟8086方式标志,是80386新设置的一个标志位。表示80386CPU是在虚拟8086环境中运行。如果80386CPU是在保护模式下运行,而VM为又被置成1,这时80386就转换成虚拟8086操作方式,使全部段操作就像是在8086CPU上运行一样。VM位只能由两种方式中的一种方式给予设置,即或者是在保护模式下,由最高特权级(0)级代码段的中断返回指令IRET设置,或者是由任务转换进行设置。Linux内核实现了虚拟8086方式,但在本书中我们不准备对此进行详细讨论。


    以下几位是新增的:

    AC (Alignment check)——位18,对齐检查。置位该标志和控制寄存器CR0 的AM 标志则启用对内存引用的对齐检查,清除这两个标志则禁用对齐检查。当引用一个没有对齐的操作数时,将会产生一个对齐检查异常,比如在奇地址引用一个字地址或在不是4 的倍数的地址引用一个双字地址。对齐检查异常只在用户态(3 级特权)下产生。默认特权为0 的内存引用,比如段描述符表的装载,并不产生这个异常,尽管同样的操作在用户态会产生异常。对齐检查异常用于检查数据的对齐,当处理器之间交换数据时这很有用,交换数据需要所有的数据对齐。对齐检查异常也可供解释程序使用。让某些指针不对齐就好比做上特殊标记,这样就无需对每个指针都进行检查,只在用到的时候,对这些特殊指针进行处理就可以了。

    VIF (Virtual Interrupt)——位19,虚拟中断。是IF 标志的一个虚拟映象。这个标志是和VIP标志一起使用的。当控制寄存器CR4 中的VME 或者PVI 标志置为1 且IOPL小于3 时,处理器只识别VIF 标志(VME 标志用来启用虚拟8086 模式扩展,PVI 标志启用保护模式下的虚拟中断)。

    VIP (Virtual interrupt pending)——位20,虚拟中断等待。置1 表明有一个正在等待处理的中断,置0 表明没有等待处理的中断。该标志和VIF 一起使用。处理器读取该标志但从来不修改它。当VME 标志或者控制寄存器CR4 中的PVI 标志置1 且IOPL 小于3 时,处理器只识别VIP 标志。(VME 标志启用虚拟8086模式扩展,PVI 标志启用保护模式虚拟中断)。

    ID (Identification)——识别(第21 位)。置1 或0 表明是否支持CPUID 指令。



    2. 控制寄存器

    状态和控制寄存器组除了EFLAGS、EIP ,还有控制寄存器组(四个32位的控制寄存器),它们是CR0,CR1,CR2和CR3。现在我们详细看看它们的结构,如下图所示。


    这几个寄存器中保存全局性任务无关的机器状态。

    CR0中包含了若干预定义标志,0位是保护允许位PE(Protedted Enable),用于启动保护模式,如果PE位置1,则保护模式启动,如果PE=0,则在实模式下运行。1位是监控协处理位MP(Moniter coprocessor),它与第3位一起决定:当TS=1时操作码WAIT是否产生一个“协处理器不能使用”的出错信号。第3位是任务转换位(Task Switch),当一个任务转换完成之后,自动将它置1。随着TS=1,就不能使用协处理器。CR0的第2位是模拟协处理器位 EM (Emulate coprocessor),如果EM=1,则不能使用协处理器,如果EM=0,则允许使用协处理器。第4位是微处理器的扩展类型位ET(Processor Extension Type),其内保存着处理器扩展类型的信息,如果ET=0,则标识系统使用的是287协处理器,如果 ET=1,则表示系统使用的是387浮点协处理器。CR0的第31位是分页允许位(Paging Enable),它表示芯片上的分页部件是否允许工作,下一节就会讲到。由PG位和PE位定义的操作方式如下图所示。

        

    CR1是未定义的控制寄存器,供将来的处理器使用。

    CR2是页故障线性地址寄存器,保存最后一次出现页故障的全32位线性地址。

    CR3是页目录基址寄存器,保存页目录表的物理地址,页目录表总是放在以4K字节为单位的存储器边界上,因此,它的地址的低12位总为0,不起作用,即使写上内容,也不会被理会。

    这几个寄存器是与分页机制密切相关的,因此,在进程管理及虚拟内存管理中会涉及到这几个寄存器,读者要记住CR0、CR2及CR3这三个寄存器的内容。


    展开全文
  • 8086寄存器的配合使用

    2019-09-06 19:58:32
    地址寄存器:专门用来存放地址信息的寄存器。 段寄存器确定存储单元的段地址,指令提供该单元相对于相应段起始地址的16位偏移量。 代码段 指令指针IP:它的作用是指明下一条指令在存储器的地址。每取一个...

    在这里插入图片描述

    通用寄存器组:可由用户灵活支配,用来寄存参与运算的数据或地址信息。
    地址寄存器:专门用来存放地址信息的寄存器。
    段寄存器确定存储单元的段地址,指令提供该单元相对于相应段起始地址的16位偏移量。

    • 代码段

    在这里插入图片描述

    指令指针IP:它的作用是指明下一条指令在存储器中的地址。每取一个指令字节,IP自动加1,如果程序需要转移或分支,只要把转移地址放入IP即可。

    • 数据段

    在这里插入图片描述在这里插入图片描述
    在这里插入图片描述

    变址寄存器SI,DI:变址寄存器的作用是用来存放要修改的地址,也可以用来暂存数据。

    在这里插入图片描述

    • 堆栈段

    在这里插入图片描述
    在这里插入图片描述

    堆栈指示器SP:用来指示RAM中堆栈栈顶的地址。SP寄存器的内容随着堆栈操作的进行,自动发生变化。

    在这里插入图片描述

    • 综上所述
      在这里插入图片描述
      在这里插入图片描述
      在这里插入图片描述
      在这里插入图片描述
    展开全文
  • 代码段程序员在编制程序时要把存储器划分成段代码段用来存放程序指令序列代码段的段地址存放在CS中指令指针寄存器IP指示代 码段中指令的偏移地址处理器利用CS:IP取得下一条要执行指令 数据段数据段存放当前运行...
  • CPU寄存器详解

    千次阅读 2018-10-23 20:06:36
    0 前言 在学习汇编和操作系统过程,总是要与...在 8086 CPU,物理地址是由地址左移 4 位,然后加上偏移地址形成。 指令都是存放在内存中的,换句话说,一个程序只有被加载到内存才能被运行。 操...

    0 前言

    在学习汇编和操作系统的过程中,总是要与许多的寄存器打交道,因此写下这篇文章,总结一下CPU中寄存器的基本知识。


    1.CS:IP寄存器

    CS为代码段寄存器,IP为段偏移寄存器,CS:IP指示了CPU当前要读取的指令的地址。在  8086 CPU中,物理地址是由段地址左移 4 位,然后加上偏移地址形成的。

    指令都是存放在内存中的,换句话说,一个程序只有被加载到内存中才能被运行。

    操作系统的外壳程序(也就是shell程序)将可执行文件加载到内存后,就会设置CPU中的CS和IP寄存器,使CS:IP指向可执行文件的起始地址。

    在程序运行时,CS:IP将会自动改变,基本上都是改变IP,从而指向下一条指令。

     

    展开全文
  • 一、DS和[address]CPU要读写一个内存单元时候,必须先给出这个内存单元地址,在8086PC内存地址有地址和偏移地址组成。DS(数据寄存器)通常存放要访问数据的段地址。比如要读取1000H单元内容,可以用下面...

    一、DS和[address]

    CPU要读写一个内存单元的时候,必须先给出这个内存单元的地址,在8086PC中内存地址有段地址和偏移地址组成。DS(数据寄存器)中通常存放要访问数据的段地址。比如要读取1000H单元的内容,可以用下面这段代码:

    mov bx,1000H

    mov ds,bx

    mov al,[0]

    注意:由于ds是一个段寄存器,8086CPU不支持将数据直接送入段寄存器的操作。为什么?(这就时8086硬件设计问题了) 所以mov ds 1000H是非法的。只能通过将数据先放到普通寄存器中,然后在放到ds寄存器中。

    mov指令可以完成两种传送:

    1、将数据直接送入寄存器(在8086CPU中,不能讲数据直接送入DS中)

    2、将一个寄存器中的内容送入另一个寄存器

    mov指令访问内存单元,可以在mov指令中只给出单元的偏移地址,此时,段地址默认在DS寄存器中。

    二、CPU提供的栈机制

    现在的CPU中都有栈的设计,在基于8086CPU编程的时候,可以将一段内存当做栈来使用。8086CPU提供入栈和出栈指令,最基本的两个是PUSH和POP。push ax 表示将寄存器ax中的数据送入栈中,pop ax表示从栈顶取出数据送入ax。8086CPU的出入栈操作都是以字节为单位进行的。

    CPU如何知道当前栈顶的地址? 这个问题和CPU如何知道当前指令的地址一样,CS IP存放在当前指定的段地址和偏移地址。SS SP存放当前段地址和偏移地址。

    三、栈顶超界问题

    8086CPU不保证我们对栈的操作不会超界,它只记录栈顶的位置,需要开发人员自己操心栈顶超届问题。

    四、段的综述

    我们可以将一段内存定义为一个段,用一个段地址指示段,用便宜地址访问段内的单元。这完全是我们自己的安排。我们可以有用一个段存放数据,将它定义为“数据段”。用一段存放代码,将它定义为“代码段”,用一段当做栈,将它定义为“栈段”。我们可以这样安排,但是若要让CPU按照这样的安排访问这些段,就要:对于数据段,将它的段地址放到DS中,用mov、add、sub等访问内存单元的指令时,CPU就将我们定义的数据段中的内容当做数据来访问。对于代码段,将它的段地址放在CS中,将段中第一条指令的偏移地址放在IP中,这样CPU就将执行我们定义的的代码段中的指令。

    可见,不管我们如何安排,CPU将内存中的某段内容当做代码,是因为CS:IP指向哪里。CPU将某段内存当做栈,是因为SS:SP指向哪里。

    展开全文
  • 寄存器(内存访问)

    2018-05-10 17:20:00
     CPU要读写一个内存单元时候,必须先给出这个内存单元地址,在8086PC内存地址有地址和偏移地址组成。DS(数据寄存器)通常存放要访问数据的段地址。比如要读取1000H单元内容,可以用下面这段代码:  ...
  • si作为偏移地址指向内存中的数减去寄存器中DH数 mov bl,byte ptr [si];将做完减法之后内存中的数赋值给BL mov bh,0;初始化BH值 mul bx;执行BX和AX乘法,乘积存放在AX add DI,ax pop dx ...
  • **编程计算以下8个数据和,结果存放在ax寄存器中** 0123h, 0456h, 0789h, 0abch, 0defh, 0fedh, 0cbah, 0987h 结果为: 4BDB P123, 《汇编语言(第2版)》,王爽 8个数据定义在代码段cs,我想法是将cs赋值给ds,...
  • 几种地址的理解

    2011-02-22 12:29:00
    逻辑地址----------->线性地址------------>物理地址在16位的机器,逻辑地址(偏移量)+基地址=物理地址 (寄存器为16位的,而地址总线为20根,所以16位地址在32位的机器段寄存器存放的是段地址的选择器,...
  • 上一节我们说到实模式寻址,在实模式下段寄存器中存放的地址,加上PC程序寄存器中存放段偏移值,两者相加即可得到物理地址。 随着CPU位数增加到32位,大部分寄存器也增加到了32位,但段寄存器仍然保持了16...
  • 与转移地址有关寻址方式

    千次阅读 2007-05-18 12:59:00
    1.如何确定当前要执行指令在内存中的位置 IP:instruction pointer....CS也是CPU内部一个寄存器,用来存放当前程序代码段的地址。 这里涉及到8086处理器寻址方式,即 段:偏移量 寻址方式。一条指令(数据)再
  • 参数x和n分别存放在存储器相对寄存器%ebp中地址偏移8和12地方。 1 movl 12(%ebp),%ecx Get n 2 movl 8(%ebp),%eax Get x 3 sall $2,%eax x 4 sarl %cl,%eax x>>=2 根据右边注释,填出缺失指令。请用算术...
  • 偏移地址部分使用32位值来指定,因此内地址可以是0~4GB。即一个段的最大长度可达4GB。程序由16位的段和32位偏移构成48位地址或长指针称为一个逻辑地址(虚拟地址)。80x86为部分提供了6个存放段...
  • 练习一 1 在计算机内部计算机能够直接执行的程序语言是 A汇编语言 B C++语言 C机器语言 D 高级语言 2 在堆栈段中存放栈顶地址的寄存器是 A IP SP BX BP 3 指令指针寄存器 IP 用来存放代码段中偏移地址在程序运行的...
  • 练习一 1 在计算机内部计算机能够直接执行的程序语言是 A汇编语言 B C++语言 C机器语言 D 高级语言 2 在堆栈段中存放栈顶地址的寄存器是 A IP SP BX BP 3 指令指针寄存器 IP 用来存放代码段中偏移地址在程序运行的...
  • 练习一 1 在计算机内部计算机能够直接执行的程序语言是 A汇编语言 B C++语言 C机器语言 D 高级语言 2 在堆栈段中存放栈顶地址的寄存器是 AIP SP BX BP 3 指令指针寄存器 IP 用来存放代码段中偏移地址在程序运行的...
  • Linux-0.11 [内核源代码带中文注释]

    热门讨论 2010-04-02 08:42:45
    表示下一条语句操作数在cs 段寄存器所指的段中。 mov sectors,cx ! 保存每磁道扇区数。 mov ax,#INITSEG mov es,ax ! 因为上面取磁盘参数中断改掉了es 值,这里重新改回。 ! Print some inane message ! 在...
  • 汇编基础

    2020-11-07 14:19:17
    CS:代码段寄存器存放代码。 CS:IP:基地址:偏移地址。 SS:SP:任意时刻,指向栈顶元素。 ES:扩展段寄存器。 栈 PUSH指令执行步骤: 1. SP=SP-2 2. 向SS:SP指向字单元送入数据 POP指令执行步骤: 1....
  • 为什么POP/POP/RET是必需

    千次阅读 2015-04-18 14:17:05
    在x86处理器,EIP(Instruction Pointer)是指令寄存器,指向处理器下条等待执行指令地址(代码段的偏移量),每次执行完相应汇编指令EIP值就会增加。ESP(Stack Pointer)是堆栈指针寄存器存放执行函数对应栈帧...
  • “d 地址:偏移地址”,这样写法地址和偏移地址都是直接给出。 通过前面几章学习,我们知道地址是放在段寄存器中的。(在指向d 1000:0时,也会先将地址送入段寄存器中) Debug靠什么执行D命令呢?...
  • NASM汇编笔记

    千次阅读 2010-05-23 16:22:00
    段寄存器存放 基地址 AX 通用寄存器CS 存放要被cpu执行的代码的基地址 code segmentIP 别名为指令指针寄存器存放段地址的偏移地址CS*16+IP 就是cpu要执行的指令debug是dos、windows都提供的实模式程序调试工具...
  • 操作系统启动过程

    2020-07-29 12:11:09
    IP寄存器=0000[0]:(Insruction pointer)存放指令在代码段的偏移量 CS:IP组合指向BIOD入口,作为处理器运行第一条指令 (2)BIOS:软件,主要提供CPU需要启动指令,具有特殊入口地址。 启动程序运行...
  • 3. 在8086,逻辑地址、偏移地址、物理地址分别指是什么?具体说明。 4. 什么是硬件中断和软件中断?在PC机两者处理过程有什么不同? 六、综合应用题(每题10分,共20 分) 现有16K×1位动态...
  • crc bypass 学习记录

    2019-05-29 19:34:10
    EAX EBX ECX EDX = 数据寄存器 E是(高16位) AX(低16位)可分为AL(高8位)、AH(低八位) EBP (Extended Base Pointer) = 基址指针寄存器 ...EIP 指令指针寄存器用来存放代码段中的偏移地址。 FLAGS 标...
  • 5.15 数据段中已定义了一个有N个字数据数组M,试编写一程序求出M中绝对值最大数,把它放在数据段M+2n单元中,并将该数的偏移地址存放在M+2(n+1)单元中。 5.16 在首地址为DATA字数组中,存放了100H个16位...
  • 汇编学习记录之五

    2018-11-20 17:23:34
    我们可以用一个段来存放数据,将它定义为“数据段”,将它地址放在数据段寄存器ds中,用mov,add,sub等访问内存单元指令时,CPU就会将我们定义数据段中的内容当作数据来进行访问。 我们可以用一个段来存放...
  • 微机学习要求答案

    2018-11-27 19:19:38
    (2)一个存放在8086计算机系统内存的数据,它以DS作为基址寄存器且设(DS)=1000H,偏移地址为2300H,会计算该数据的物理地址(同样是:基地址左移4位+偏移地址),指向这一物理地址的DS值和偏移...
  • (2)一个存放在8086计算机系统内存的数据,它以DS作为基址寄存器且设(DS)=1000H,偏移地址为2300H,会计算该数据的物理地址(同样是:基地址左移4位+偏移地址),指向这一物理地址的DS值和偏移...

空空如也

空空如也

1 2 3
收藏数 43
精华内容 17
关键字:

存放代码段中偏移地址的寄存器是