首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

【汇编】(二)寄存器(CPU工作原理)

8086CPU 采用一种在内部用两个16位地址合成的方法来形成一个20位的物理地址: 8086CPU读写内存时,发生了这么一些事: CPU 中的相关部件提供两个16位的地址,一个称为段地址,另一个称为偏移地址...8086CPU有4个段寄存器:CS、DS、SS、ES; 当 8086CPU 要访问内存时,由这4个段寄存器提供内存单元的段地址。  ...在 8086CPU 加电启动或复位后( 即 CPU 刚开始工作时)CS 和 IP 被设置为 CS=FFFFH,IP=0000H。...jmp 段地址:偏移地址 jmp 2AE3:3 jmp 3:0B16 仅修改IP的内容: jmp 某一合法寄存器 jmp ax (类似于 mov IP,ax) jmp bx CPU运行的流程 内存中存放的机器码和对应汇编指令情况...当8086 CPU 要访问内存时,由段寄存器提供内存单元的段地址。8086 CPU 有4个段寄存器,其中 CS 用来存放指令的段地址。 2、CS 存放指令的段地址,IP 存放指令的偏移地址。

59230

【汇编语言】寄存器(CPU工作原理)(五)—— 段寄存器以及CS和IP

段寄存器 我们前面讲到,8086CPU在访问内存时要由相关部件提供内存单元的段地址和偏移地址,送入地址加法器合成物理地址。这里,需要看一下,是什么部件提供段地址。段地址在8086CPU的段存器中存放。...8086CPU有4个存器:CS、DS、SS、ES。当8086CPU 要访问内存时由这4个段寄存器提供内存单元的段地址。本章中只看一下CS。 2....上图说明如下 8086CPU当前状态:CS中的内容为2000H,IP中的内容为0000H: 内存20000H~20009H单元存放着可执行的机器码; 内存20000H~20009H单元中存放的机器码对应的汇编指令如下...在8086CPU加电启动或复位后(即CPU刚开始工作时)CS和IP被设置为CS=FFFFH,IP=0000H,即在8086PC机刚启动时,CPU从内存FFFFOH单元中读取指令执行,FFFFOH单元中的指令是...我们可以说,CPU将CS:IP指向的内存单元中的内容看作指令,因为,在任何时候,CPU将CS、IP中的内容当作指令的段地址和偏移地址,用它们合成指令的物理地址,到内存中读取指令码,执行。

21810
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    从进入内核态看内存管理

    为 0x0003,那么对应的指令地址为 图示为真实的物理地址计算方式,从中可知, CS 其实保存的是真实物理地址的高 16 位 分段的初衷是为了解决寻址问题,但本质上段寄存器中保存的还是真实物理地址的段基础...,且可以随意指定,所以它也无法支持多进程,因为这意味着进程可以随意修改 CS:IP 将其指向任意地址,很可能会覆盖正在运行的其他进程的内存,造成灾难性后果。...当通过线性地址(在只有段式内存情况下,线性地址为物理地址)访问一个内存页时。...另外当执行中断程序时,还需要首先把当前用户进程中对应的堆栈,返回地址等信息,以便切回到用户态时能恢复现场 可以看到 int 80h 这种软件中断的执行又是检查特权级,又是从用户态切换到内核态,又是保存寄存器的值...20 位的内存地址呢,于是段的概念被提出了,段的出现虽然解决了寻址问题,但本质上 CS IP 的寻址方式依然还是绝对物理地址,这样的话由于地址会互相覆盖,显然无法做到多进程运行,于是保护模式被提出了

    99250

    爱了爱了,这篇寄存器讲的有点意思

    我们在合成物理地址的那张图提到了 相关部件 的概念,这个相关部件其实就是段寄存器,即 「CS、DS、SS、ES」 。8086 的 CPU 在访问内存时,由这四个寄存器提供内存单元的段地址。...CS 寄存器 要聊 CS 寄存器,那么 IP 寄存器是你绕不过去的曾经。CS 和 IP 都是 8086 CPU 非常重要的寄存器,它们指出了 CPU 当前需要读取指令的地址。...此时这个指令就已经具备执行条件,此时 IP 也就是指令指针会自动增加。我们上面说到 IP 其实就是从 Code Segment 也就是 CS 处偏移的地址,也就是偏移地址。...当使用 「PUSH」 指令向栈中压入 1 个字节单元时,SP = SP - 1;即栈顶元素会发生变化; 而当使用 「PUSH」 指令向栈中压入 2 个字节的字单元时,SP = SP – 2 ;即栈顶元素也要发生变化...; 当使用 「POP」 指令从栈中弹出 1 个字节单元时, SP = SP + 1;即栈顶元素会发生变化; 当使用 「POP」 指令从栈中弹出 2 个字节单元的字单元时, SP = SP + 2 ;即栈顶元素会发生变化

    5.4K32

    汇编语言-第二章 寄存器(CPU工作原理)

    当8086CPU要读写内存时: (1).CPU中的相关部件提供两个16位地址,一个称为段地址,一个称为偏移地址 (2).段地址和偏移地址通过内部总线送入一个称为地址加法器的部件 (3).地址加法器将两个...2.7 “段地址×16+偏移地址=物理地址”的本质含义 本质含义就是: CPU在访问内存时,用一个基础地址(段地址×16)和一个相对基础地址的偏移地址相加,给出内存单元的物理地址。...8086有4个段寄存器:CS,DS,SS,ES。 2.10 CS和IP 当8086CPUCPU要访问内存时由这4个段寄存器提供内存单元的段地址。...mov指令不能用于设置CS、IP的值,原因是:8086没有提供这样的功能。 能够改变CS、IP的内容的指令被统称为转移指令。...2.9节~2.12节 小结 段地址在8086CPU的段寄存器中存放。当8086CPU要访问内存时,由段寄存器提供内存单元的段地址。8086CPU有4个段寄存器,其中CS用来存放指令的段地址。

    85420

    【读书笔记】汇编语言(第四版)第二章 寄存器

    字:记为word, 一个字由两 物理地址&16位结构的CPU&8086CPU给出物理地址的方法 CPU 访问内存单元时,要给出内存单元的地址。...8086CPU 相关部件的逻辑结构如图 如图2.6 所示,当8086CPU 要读写内存时: (l) CPU 中的相关部件提供两个16 位的地址, 一个称为段地址,另一个称为偏移地址; (...“数据在内存21F60H 单元中” 段寄存器&CS和IP&修改CS、 IP的指令&代码段 8086CPU 在访问内存时要由相关部件提供内存单元的段地址和偏移地址,送入地址加法器合成物理地址 段地址在8086CPU...的段寄存器中存放 8086CPU 有4 个段寄存器: CS 、DS 、SS 、ES 当8086CPU 要访问内存时由这4 个段寄存器提供内存单元的段地址 CS 和IP 是8086CPU 中两个最关键的寄存器...当8086CPU 要访问内存时,由段寄存器提供内存单元的 段地址。

    9910

    汇编语言访问寄存器和内存篇---02

    Debug q - 退出Debug ---- CS、IP与代码段 两个关键的寄存器 CS:代码段寄存器 IP: 指令指针寄存器 CS:IP:CPU将内存中CS:IP 指向的内容当作指令执行。...CS提供段地址,16位 IP可以理解为PC寄存器,提供的是偏移地址,也是16位 位址加法器对两个16位地址进行相加,然后得到一个20位地址 通过BUS地址总线,发送给MAR MAR从内存中取出该地址对应的指令...---- jmp指令 修改CS、IP的指令: 事实:执行何处的指令,取决于CS:IP 应用:可以通过改变CS、IP中的内容,来控制CPU要执行的目标指令 问题:如何改变CS、IP的值?...(4)在内存和寄存器之间传送字型数据时,高地址单元和高8位寄存器、 低地址单元和低8位寄存器相对应。...栈顶超界问题: 如何能够保证在入栈、出栈时,栈顶不 会超出栈空间?

    90111

    Linux从头学02:x86中内存【段寻址】方式的来龙去脉

    中,已经提到过,在处理器的内部,执行每一条指令码时,CPU 是非常机械、非常单纯地从 CS:IP 这 2 个寄存器计算得到转换后的物理地址,从这个物理地址所指向的内存地址处,读取一定长度的指令,然后交给逻辑运算单元...物理地址的计算方式是:CS * 16 + IP。 当 CPU 读取一条指令后,根据指令操作码它能够自动知道这条指令一共需要读取多少个字节。...例如,在内存 20000H 开始的地方,存在 2 条指令: mov ax, 1122H mov bx, 3344H 当执行第一条指令时,CS = 2000H,IP = 0000H,经过地址转换之后的物理地址是...因此,用来对代码段进行寻址的这两个寄存器 CS 和 IP,它们的含义就非常清楚了: CS: 段寄存器,其中的值左移 1 位之后,得到的值就表示代码段在内存中的首地址,或者称作基地址; IP: 指令指针寄存器...超过了 1 MB 的空间大小,但是毕竟只有 20 根地址线,肯定是无法寻址超过 1 MB 地址空间的,因此系统会采取回绕的方式来定位到一个地址空间,类似与数学中的取模操作。

    1.7K30

    汇编语言从入门到精通-2CPU资源和存储器

    在使用第5.2.9节中的“条件转移指令”时,系统会自动引用相应标志位的值来决定是否需要“转移”的,所以,不必过分强调标志位在标志寄存器内的具体位置。...图2.5 16位CPU物理地址计算示意图 图2.6 物理地址和逻辑地址之间的关系 对物理地址来说,当段地址变化时,只要对其偏移量进行相应的调整就可对应同一个物理地址,所以,同一个物理地址可有多个逻辑地址...表2.2 段寄存器及其指针寄存器的引用关系 访问存储器方式 缺省的段寄存器 可选用的段寄存器 偏移量 取指令 CS IP 堆栈操作 SS SP 一般取操作数 DS CS、ES...在实方式下,由于段的最大容量不超过64K,所以,EIP的高16位全为0,其效果相当于16位CPU中的IP。     堆栈段寄存器:32位微机在访问堆栈段时,总是引用堆栈段寄存器SS。...另外,段寄存器CS、SS、ES、FS和GS也都可以作为访问数据时的段寄存器,但它们必须用段超越前缀的方式在指令中直接写出。用这种方式会增加指令的长度,指令的执行时间也有所延长。

    72130

    通过linux0.11源码理解进程的虚拟地址、线性地址、物理地址

    假设当前执行cs:ip指向的代码,系统根据ldt的值从gdt中选择一个元素,里面保存的是idt结构的首地址。...然后根据cs的值选择idt表格中的一项,从而得到代码段的基地址和限长,用基地址加上ip指向的偏移得到一个线性地址,这个线性地址分为三个部分,分别是页目录索引,页表索引,物理地址偏移。...到进程被调度执行时所发生的事情。fork函数的具体调用过程之前已经分析过。下面贴一下主要的代码。...用线性地址的首地址加上ip 中的偏移,得到线性地址,然后再通过页目录和页表得到物理 地址,物理地址还没有分配则进行缺页异常等处理。...最后根据tss中的cs和ip执行进程。这就是文章开头的过程。这就是linux0.11版本中进程地址管理的实现。下面是fork后的结构图。 ?

    1.5K60

    万字整理内存管理之Cache

    因此,这3个地址对应的cache line是同一个。所以,当我们访问0x00地址时,cache会缺失,然后数据会从主存中加载到cache中第0行cache line。...当我们访问0x40地址时,依然索引到cache中第0行cache line,由于此时cache line中存储的是地址0x00地址对应的数据,所以此时依然会cache缺失。...读分配(read allocation) 当CPU读数据时,发生cache缺失,这种情况下都会分配一个cache line缓存从主存读取的数据。默认情况下,cache都支持读分配。...Cache更新策略(Cache update policy) cache更新策略是指当发生cache命中时,写操作应该如何更新数据。cache更新策略分成两种:写直通和回写。...别名(alias) 当不同的虚拟地址映射相同的物理地址,而这些虚拟地址的index不同,此时就发生了别名现象(多个虚拟地址被称为别名)。

    1K20

    8086汇编语言之数据段和代码段以及栈段的理解

    代码段CS+偏移地址段IP 代码段可以通俗理解为汇编代码指针 比如: 代码从 MOV AX 0220H 开始,那么代码段指向这行代码地址, 如果想要跳过这行代码的执行,那么进行代码段偏移 在通过debug...模式配合-u指令查看汇编代码时,可以根据CS进行范围查看: 比如: #以下模拟控制台输出 -r AX=0000 BX=0000........DS=13DB ES=13DB SS=13EB CS=13EB IP=0000 -u 13eb:0 13BE:0000 B8FFFF MOV AX,FFFF 栈段SS+偏移地址段SP 栈段可以通俗理解为栈指针...由8086CPU (段地址+偏移地址=“物理地址”) 的方式给出内存单元的物理地址,使得我们用分段的方式管理内存 可以将段通俗理解为小区的一栋楼,偏移地址为这栋楼的住户门牌号.比如五号楼101房,那么形象比喻...这是由于8086cpu16位寄存器局限性造成的, 由于16位的寄存器最大只能存放0xFFFF 如果存放超过五位的地址比如0xFFFFA 则无法存放, 为了解决这个问题, cup设计者想出了 段地址*16

    2.3K30

    通过do_execve源码分析程序的执行(下)(基于linux0.11)

    上篇讲了程序的加载。然后设置了eip,这一篇分析一下开始执行第一条指令的时候。会发生什么。 我们先看一下这时候的内存布局。 ? 在这里插入图片描述 当cpu通过cs:eip执行第一条指令的时候。...首先通过cs的值,在ldt中找到代码段的基地址,然后加上eip,得到线性地址,然后通过线性地址到页目录和页表项里找是否已经映射到物理地址了。这时候发现,还没有对应的物理地址,然后就触发缺页中断。.../ tmp大于等于end_data说明是访问堆或者栈的空间时发生的缺页,直接申请一页 if (!...并且建立线性地址到物理地址的映射。然后重新执行cs:eip对应的指令,这时候就能找到对应的指令执行了。...同理,当我们通过ds访问数据段的时候也是这样,在指令里,访问数据的时候,用的地址是相对数据段的偏移,通过地址的转换,会落到数据段对应的线性地址里。然后通过缺页中断加载进来。

    92830

    写一个boot引导程序

    BIOS引导原理 首先要了解BIOS的引导原理。启动时自检过程中会去检查磁盘的第0磁头第0磁道的第1扇区,检查其是否以0x55和0xaa为结尾,如果是的话,就认为它是一个引导扇区。...接着就会将这个扇区复制到内存的0x7c00处,随后从0x7c00处开始执行。 BIOS跳转到引导程序的之前,会初始化处理器,设置CS寄存器为0x0000,指令指针寄存器IP为0x7c00....这个时候cpu处于实模式下,物理地址必须经过CS和IP寄存器转换才能得到,公式为:物理地址=(CSIP。对应的也是物理地址的0x7c00....初始化寄存器 这里涉及到几个寄存器 cs “代码段寄存器”,对应于内存中的存放代码的内存区域,用来存放内存代码段区域的入口地址(段基址) ax 累加寄存器 ds 数据段寄存器 es 附加段寄存器 ss...INT 10h, AH=06h时,功能是按指定范围滚动窗口。

    62230

    ret指令与call指令的深入理解

    其中ret指令用栈中的数据,修改IP的内容,实现近转移。而call指令将IP或者CS和IP压入栈中,实现转移。还有retf指令,用栈中的数据,修改CS和IP的内容,实现远转移。...(8086CPU有四个段寄存器,CS、DS、SS、ES,当CPU要访问内存是由这四个段寄存器提供内存单元的段地址。)...执行控制器执行指令后,AX内的内容为0123H。 5、读取一条指令后,IP中的值会自动增加,以使CPU可以读取下一个指令。...输入输出电路将物理地址送上地址总线。故段地址和偏移地址也即CS内地址数据和IP内地址数据。 ret指令与call指令实现了什么功能?...当子程序执行完后,由于call指令后面的指令的地址已经存储在栈中( push操作), 使得在子程序后面再使用ret指令时候,栈中的数据会设置IP内的值, IP内的值的设置实现了CPU继续执行call指令后面的代码指令

    4.8K20

    微机原理与接口技术 重点详解与章节总结——8086微处理器系统结构

    当执行转移指令、调用指令时,BIU装入IP中的是转移目的地址。 偏移地址表示离段起始地址之间的距离,用字节数表示。...6字节的指令队列:当执行单元EU正在执行指令中,且不需要占用总线时,BIU会自动进行预取下一条或几条指令的操作,并按先后次序存入指令队列中排队,由EU按顺序取来执行。...取指令时的地址由代码段寄存器CS中的16位段基址的最低位后补4个0,再与指令指针IP中的16位偏移地址在地址加法器中相加得到20位物理地址。...这样对于20位的段起始地址,其低4位为0,可暂时先忽略,而只有高16位是有效数字,可存放于16位的寄存器中。在形成20位物理地址时,段寄存器中的16位数会自动左移4位,然后与16位偏移量相加 。...4、中断返回 当执行到IRET指令时,自动弹出IP和CS以及标志寄存器FR,返回中断前的程序位置,执行下一条指令。

    7.6K20

    Linux从头学05-系统启动过程中的几个神秘地址,你知道是什么意思吗?

    把段寄存器 cs 设置为 0xFFFF,指令寄存器 ip 设置为 0x0000; 把其它的所有寄存器设置为 0x0000; 当所有的初始化完成之后,CPU 就开始执行第一条指令。...之前说过,CPU 是很傻、很单纯的,它只知道去 cs:ip 所指向的地址处,取出一条指令,执行完之后,再取出下一条指令继续执行。。。...既然硬件初始化时,已经把 cs 初始化为 0xFFFF,把 ip 初始化为 0x0000,经过段寻址的公式计算之后,就得到了物理地址:0xFFFF0,也就是说,CPU 执行的第一条指令位于物理地址 0xFFFF0...此时,cs:ip 计算得到的物理地址为 0xFFFF0,正好落在映射到 ROM 的这块内存空间。 因此,从这个地址中获取到指令,其实就是从 ROM 中读取的。...CPU 在执行指令的时候,ip 寄存器是递增的,也就是说会从低地址到高地址,依次执行每一条指令。

    1.8K30

    甄建勇:五分钟搞定Cache(上)

    所以如果采用directmapped的话,core在访问cache时,根据TLB处理之后的物理地址,进行取模(%)运算,就可以直接确定其cache的位置,由于一个cacheline可能对应不同的内存地址...所以,如果采用setassociative的话,core在访问cache时,根据TLB处理之后的物理地址,先将物理地址取模,得到其可能的cache的组,然后再依次与组内的所有cacheline的tag进行比较...写回是指,仅当一个缓存块需要被替换回内存时,才将其内容写入内存。如果缓存命中,则总是不用更新内存。...当发生写失效时,缓存可有两种处理策略,分别称为分配写(Writeallocate)和非分配写(No-writeallocate)。...对于不同组合,发生数据写操作时的行为也有所不同。 对于组相联缓存,当一个组的全部缓存块都被占满后,如果再次发生缓存失效,就必须选择一个缓存块来替换掉。存在多种策略决定哪个块被替换。

    90941

    ARP协议:地址解析协议

    当一台设备需要向另一台设备发送数据时,它首先需要知道目标设备的物理地址,因为在局域网内,数据包的传输是通过物理地址进行的。 ARP协议的主要功能是建立和维护IP地址与物理地址之间的映射关系。...具体而言,ARP的工作过程包括: ARP请求(ARP Request): 当设备A需要与设备B通信,但不知道设备B的物理地址时,设备A会向局域网发送一个ARP请求广播。...ARP请求 当一台设备需要与局域网内的另一台设备通信时,它首先检查自己的ARP缓存(ARP Cache)中是否已经有目标设备的物理地址。...如果缓存中没有目标设备的物理地址,发送方将发起一个ARP请求广播,询问局域网中是否有与目标IP地址相对应的物理地址。 2....当一个计算机需要与另一台计算机通信,但在其ARP缓存中没有目标IP地址对应的MAC地址时,它会向本地网络广播ARP请求,请求其他计算机告诉它目标IP地址的MAC地址。

    65910

    《汇编语言》——笔记(一)

    汇编语言发展至今,由以下3类指令组成: 汇编指令:机器码的助记符,有对应的机器码 伪指令:没有对应的机器码,由编译器执行,计算器不执行 其他符号:如+、-、*、/ 等,有编译器识别,没有对应的机器码。...8086CPU采用一种在内部用两个16位地址合成的方法形成一个20位的物理地址。 80806CPU要读写内存时,提供的两个16位地址被地址加法器合成一个20位的物理地址。...段地址保存在8086CPU的段寄存器中存放,有4个段寄存器:CS、DS、SS、ES。这里只介绍CS. CS和IP CS为代码段寄存器,IP为指令指针寄存器。CS提供的为段地址,IP提供了偏移地址。...CPU从何处执行指令是由CS:IP中的内容决定的,修改CS:IP的值就可以控制CPU执行目标指令。...PUSH、POP操作时栈顶标记会发生改变,CPU如何知道这栈顶标记呢? 回想另一个问题,CPU如何知道当前要执行的指令所在的位置?CS、IP所指的指令存放着当前指令的短地址和偏移地址。

    1.2K20
    领券