精华内容
下载资源
问答
  • STM32问题速记:寄存器地址与寄存器位之间的关系(已解决)
    千次阅读
    2020-01-09 16:06:04

    寄存器地址和寄存器位之间的关系?

    答:8位为一个字节,题中32位即4个字节,10个寄存器为40个地址。 

    更多相关内容
  • CPU和寄存器详解

    千次阅读 多人点赞 2022-01-21 18:59:04
    1.CPU 编译器是一个将用用程序语言写的程序翻译成特殊结构...时钟并不记录分秒。它以不变的速率简单跳动。电子计算机通过使用这个跳动来正确执行它们的操作,就像节拍器的跳动如何来帮助你以正确的节奏播放音乐。一

    1.CPU

    • 编译器是一个程序,它可以将我们所写的程序翻译成特殊的机器语言结构。通常,每一种类型的CPU都有它自己唯一的机器语言。这是为什么为Mac写的程序不能在IBM类型PC机运行的一个原因。

    • 电脑通过使用时钟来同步指令的执行。时钟脉冲在一个固定的频率(称为时钟频率)。当你买了一台1.5GHz的电脑,1.5GHz就是时钟频率,即每秒15亿次的时钟脉冲。时钟并不记录分和秒。它以不变的速率简单跳动。电子计算机通过使用这个跳动来正确执行它们的操作,就像节拍器的跳动如何来帮助你以正确的节奏播放音乐。一个指令需要跳动的次数(或就像他们经常说的执行周期)依赖CPU的产生和模仿。周期的次数取决于它之前的指令和其他因素。

    2.程序内存需要分段(以8086CPU为例)

    在这里插入图片描述

    • 内存按访问的方式来看,就像长方形的带子,地址依次升高。内存是一个随机读写设备,即可以访问内部任何一处,不需要从头开始找,只要直接给出实际物理地址即可。
    • 而分段是内存访问的机制,是给CPU用的访问内存的方式,只有CPU才会关注段
      • 8086CPU有20根地址线,最大可寻址内存空间为1MB,2^20Byte。而8086的寄存器只有16位,指令指针(IP)和变址寄存器(SI、DI)也是16位的。用16位的地址寻址1MB空间是不可能的。所以就要把内存分段,也就是把1MB空间分为若干个段,每段不超过64KB,在8086中设置4个16位的段寄存器,用于管理4段,注意这里是,不是(内存是分成四种段,这是考虑到程序执行时需要的四个部分。但是,内存不止四个段,只是同时最多只有四个段在工作,其他的在“睡眠”,需要时再“唤醒”。),具体种类为:CS是代码段,DS是数据段,SS是堆栈段,ES是附加段。
      • 内存分段后,内存的地址(又称物理地址)就由两部分组成:段地址和段内偏移地址,段寄存器管理的是段地址。把内存分段后,每一个段就有一个段基址,段寄存器保存的就是这个段基址的高16位,这个16位的地址左移四位(后面加上4个0)就可构成20位的段基址。
      • 上述便是段地址×16(或者左移四位)+偏移地址=物理地址”的寻址模式的由来。
    • 第二个是保护模式下,段(segmentation)强调的是分割,用来把内存分成不同的地址空间,每个段一个空间,而后通过CPU的MMU转换成实际物理地址。由于程序运行在不同的段里,根本上保护了CPU保护模式下的各个不相关的代码,所谓进程或者作业。

    3.CPU的不同型号

    • 8088,8086:
      这些CPU从编程的观点来看是完全相同的。它们是用在早期PC机上的CPU。它们提供一些16位的寄存器:AX,BX,CX,DX,SI,DI,BP,SP,CS,DS,SS,ES,IP,FLAGS。它们仅仅支持1M字节的内存,而且只能工作在实模式下。在这种模式下,一个程序可以访问任何内存地址,甚至其它程序的内存!这会使排除故障和保证安全变得非常困难!而且,程序的内存需要分成段。每段不能大
      于64K,即2^16Byte(16位的寄存器)。

    • 80286:
      这种CPU使用在AT系列的PC机中。它在8088/86的基本机器语言中加入了一些新的指令。然而,它主要的新的特征是16位保护模式。在这种模式下,它可以访问16M字节的内存和通过阻止访问其它程序的内存来保护程序。可是,程序依然是分成不能大于64K的段,即2^16Byte(16位的寄存器)。

    • 80386:
      这种CPU极大地增强了80286的性能。首先,它扩展了许多寄存器来容纳32位数据(EAX,EBX,ECX,EDX,ESI,EDI,EBP,ESP,EIP)而且增加了两个新的16位寄存器(FS,GS)。它同样增加了一个新的32位保护模式。在这种模式下,它可以访问4G字节。程序同样分成段,但是现在每段大小同样可以到4G,即2^32Byte(32位的寄存器)

    • 还有很多CPU型号这里不在列出,毕竟我们不做CPU的芯片开发,我们学习结构较为简单的CPU,了解其原理即可。

    4.十六位寄存器(以8086为例,即x86架构)

    寄存器是CPU内部的存储部件与内存空间没有关系,设置寄存器的原因是为了减少CPU与内存交换数据的次数,以提高计算机的工作速度。
    在这里插入图片描述
    8086 CPU 中寄存器总共为 14 个,即 AX,BX,CX,DX,SP,BP,SI,DI,IP,FLAG,CS,DS,SS,ES,且都为16位。

    4.1通用寄存器:

    通用寄存器有 8 个,分别是 AX,BX,CX,DX,SP,BP,SI,DI 。

    4.1.1数据寄存器:

    AX,BX,CX,DX 称作为数据寄存器,都可以暂存一般的数据,他们还具有其他的特殊用途,具体的特殊用途如下:

    • AX (Accumulator):累加寄存器,也称之为累加器,除了做加法以外,还可以做乘法或除法,当操作的数是16位的时候经常与DX搭配使用,如下:

      • 做除法(DIV)运算时:
        除数可以存放在寄存器中或者是内存单元中被除数默认放在AX或(DX和AX)中,如果除数为8位,被除数则为16位,默认放在AX中;如果除数为16位,那么被除数就为32位,存放在DX和AX两个寄存器中,高16位存放在DX,低16位存放在AX。即除数可以是 8 位或者是 16 位的:

        • 当除数是 8 位时,被除数一定会是 16 位的,并且默认是放在 AX 寄存器中,如果除数是 8 位的,则在 AL 中会保存此次除法操作的商,而在 AH 中则会保存此次除法操作的余数,
        • 而当除数是 16 位时,被除数一定是 32 位的,因为 AX 是 16 位寄存器,自然,放不下 32 位的被除数,所以,在这里还需要使用另一个 16 位寄存器 DX ,其中 DX 存放 32 位的被除数的高 16 位,而 AX 则存放 32 位的被除数的低 16 位,同时,AX 的作用还不仅仅是用来保存被除数的,当除法指令执行完成以后,当然,如果除数是 16 位的话,则 AX 中会保存本次除法操作的商,而 DX 则保存本次除法操作的余数。
      • 做乘法(MUL)运算时:
        两个相乘的数要么都是 8 位,要么都是 16 位:

        • 如果两个相乘的数都是 8 位的话,则一个默认是放在 AL 中,而另一个 8 位的乘数则位于其他的寄存器或者说是内存字节单元中,当 MUL 指令执行完毕后,如果是 8 位的乘法运算,则默认乘法运算的结果是保存在 AX 中,
        • 而如果两个相乘的数都是 16 位的话,则一个默认存放在 AX 中,另一个 16 位的则是位于 16 的寄存器中或者是某个内存字单元中。
          同时,而如果是 16 位的乘法运算的话,则默认乘法运算的结果有 32 位,其中,高位默认保存在 DX 中,而低位则默认保存在 AX 中。
    • BX (Base):基地址寄存器;
      BX 主要还是用于其专属功能 :存储偏移地址(与段寄存器搭配,可以寻址物理地址)。
      如果未额外指明寄存器,会默认使用 DS 段寄存器,例如 [BX],相当于DS:[BP]
      段地址×16(或者左移四位)+偏移地址=物理地址

    • CX (Count):计数器寄存器;
      CX 中的 C 被翻译为 Counting 也就是计数器的功能,当在汇编指令中使用循环 LOOP 指令时,可以通过 CX 来指定需要循环的次数,而 CPU 在每一次执行 LOOP 指令的时候,都会做两件事:

      • 一件就是令 CX = CX – 1,即令 CX 计数器自动减去 1;
      • 还有一件就是判断 CX 中的值,如果 CX 中的值为 0 则会跳出循环,而继续执行循环下面的指令,如果 CX 中的值不为 0 ,则会继续执行循环中所指定的指令 。
    • DX (Data):数据寄存器;
      在做除法(DIV)或者乘法(MUL)运算的时候可以搭配AX使用,请参考上面关于AX详细用法的讲解。

    4.1.2指针寄存器:

    • SP (Stack Pointer):堆栈指针寄存器;
      段地址使用默认的 SS 寄存器中的值
      在任何时刻,SS:SP 都是指向栈顶元素
    • BP (Base Pointer):基指针寄存器;
      段地址使用默认的 SS 寄存器中的值
      bp为基址寄存器,一般在函数中用来保存进入函数时的sp的栈顶基址。
      sp会随着带有堆栈操作的指令(比如PUSH、CALL、INT、RETF)产生变化,而BP不会,所以在带参数的子过程中用BP来获取参数和访问设在堆栈里面的临时变量。
      每次子函数调用时,系统在开始时都会保存这个两个指针并在函数结束时恢复sp和bp的值。如下
      在函数进入时:
    push bp // 保存bp指针
    mov bp,sp // 将sp指针传给bp,此时bp指向sp的基地址。
    // 这个时候,如果该函数有参数,则[bp + 2*4]则是该子函数的第一个参数,[bp+3*4]则是该子函数的 第二个参数,以此类推,有多少个参数则[bp+(n-1)*4]。
    .....
    .....
    函数结束时:
    mov sp,bp // 将原sp指针传回给sp
    pop bp // 恢复原bp的值。
    ret // 退出子函数
    

    只有在寻找堆栈里的数据和使用个别的寻址方式时候才能用到
    比如说,堆栈中压入了很多数据或者地址,你肯定想通过SP来访问这些数据或者地址,但SP是要指向栈顶的,是不能随便乱改的,这时候你就需要使用BP,把SP的值传递给BP,通过BP来寻找堆栈里数据或者地址。

    他们也是通用寄存器,在许多情况下也可以像通用寄存器一样暂存数据。但是,它们不可以分解成两个8位寄存器,因为只有数据寄存器才可以分解成两个8位寄存器。

    4.1.3变址寄存器

    • SI (Source Index):源变址寄存器;
      SI会默认使用 DS 段寄存器
    • DI (Destination Index):目的变址寄存器;
      DI 会默认使用 DS 段寄存器

    两个16位指针寄存器:SI 和DI 。通常它们都是当作指针来使用,但是在许多情况下也可以像通用寄存器一样暂存数据。但是,它们不可以分解成两个8位寄存器,因为只有数据寄存器才可以分解成两个8位寄存器。

    4.2段寄存器:

    • CS (Code Segment):代码段寄存器;
    • DS (Data Segment):数据段寄存器;
    • SS (Stack Segment):堆栈段寄存器;
    • ES (Extra Segment):附加段寄存器;

    16位CS,DS,SS 和ES 寄存器是段寄存器。它们指出程序不同部分所使用的内存。CS代表代码段,DS 代表数据段,SS 代表堆栈段和ES代表附加段。ES当作一个暂时段寄存器来使用。这些寄存器的细节描述在后面的文章中。

    4.3控制寄存器

    • IP (Instruction Pointer):指令指针寄存器;
      指令指针寄存器(IP) 与CS寄存器一起使用来跟踪CPU下一条执行指令的地址。通常,当一条指令执行时,IP提前指向内存里的下一条指令。
    • FLAG:标志寄存器;
      FLAGS寄存器储存了前面指令执行结果的重要信息。这些结果在寄存器里以单个的位储存。例如:如果前面指令执行结果是0,Z位为1,反之为0。并不是所有指令都修改FLAGS里的位。

    5. 三十二位寄存器(80386 )

    • 80386及以后的处理器扩展了寄存器。例如:16位AX寄存器扩展成了32位。为了向后兼容,AX依然表示16位寄存器而EAX 用来表示扩展的32位寄存器。AX是EAX 的低16位就像AL是AX(EAX)的低8位一样。但是没有直接访问EAX 高16位的方法。其它的扩展寄存器是EBX,ECX,EDX,ESI 和EDI 。
    • 许多其它类型的寄存器同样也扩展了。BP变成了EBP;SP 变成了ESP;FLAGS变成了EFLAGSEFLAGS 而IP变成了EIP。但是,不同于指针寄存器和通用寄存器,在32位保护模式下只有这此寄存器的扩展形式被使用。
    展开全文
  • 一、通用寄存器 寄存器 编号(二进制) 编号(十进制) 64位 32位 16位 8位 累加寄存器 RAX EAX AX AL 000 0 计数寄存器 RCX ECX CX ...

    一、通用寄存器

     

    寄存器    编号(二进制)编号(十进制)
     64位32位16位8位  
    累加寄存器RAXEAXAXAL0000
    计数寄存器RCXECXCXCL0011
    数据寄存器RDXEDXDXDL0102
    基址寄存器RBXEBXBXBL0113
    堆栈顶指针RSPESPSPAH1004
    堆栈基指针RBPEBPBPCH1015
    变址寄存器RSIESISIDH1106
    指令寄存器RDIEDIDIBH1117


    数据寄存器    EAX,  EBX,  ECX, EDX  (Data Register)

    数据寄存器主要用来保存操作数和运算结果等信息,从而节省读取操作数所需占用总线和访问存储器的时间。 
    32位CPU有4个32位的通用寄存器EAX、EBX、ECX和EDX。对低16位数据的存取,不会影响高16位的数据。这些低16位寄存器分别命名为:AX、BX、CX和DX,它和先前的CPU中的寄存器相一致。4个16位寄存器又可分割成8个独立的8位寄存器:

    • AX可分为AH和AL.
    • BX可分为BH和BL.
    • CX可分为CH和CL.
    • DX可分为DH和DL.

    每个寄存器都有自己的名称,可独立存取。程序员可利用数据寄存器的这种“可分可合”的特性,灵活地处理字/字节的信息。

    寄存器AX通常称为累加器(Accumulator Register),用累加器进行的操作可能需要更少时间。累加器可用于乘、除、输入/输出等操作,它们的使用频率很高; 

    寄存器BX称为基址寄存器(Base Register)。它可作为存储器指针来使用; 

    寄存器CX称为计数寄存器(Count Register)。在循环和字符串操作时,要用它来控制循环次数;在位操作中,当移多位时,要用CL来指明移位的位数; 

    寄存器DX称为数据寄存器(Data Register)。在进行乘、除运算时,它可作为默认的操作数参与运算,也可用于存放I/O的端口地址。

    指针寄存器  EBP,  ESP   (Pointer Register)
    32位CPU有2个32位通用寄存器EBP和ESP。其低16位对应先前CPU中的SBP和SP,对低16位数据的存取,不影响高16位的数据。

    指针寄存器主要用于存放堆栈内存储单元的偏移量,用它们可实现多种存储器操作数的寻址方式(在第3章有详细介绍),为以不同的地址形式访问存储单元提供方便。指针寄存器不可分割成8位寄存器。作为通用寄存器,也可存储算术逻辑运算的操作数和运算结果。

    寄存器BP称为基址指针寄存器(Base Pointer);

    寄存器SP称为堆栈指针寄存器(Stack Pointer)。

    变址寄存器  ESI,   EDI   (Index Register)
    32位CPU有2个32位通用寄存器ESI和EDI。其低16位对应先前CPU中的SI和DI,对低16位数据的存取,不影响高16位的数据。

    变址寄存器主要用于存放存储单元在段内的偏移量,用它们可实现多种存储器操作数的寻址方式(在第3章有详细介绍),为以不同的地址形式访问存储单元提供方便。 变址寄存器不可分割成8位寄存器。作为通用寄存器,也可存储算术逻辑运算的操作数和运算结果。
    寄存器SI称为源变址寄存器 (Source Index);

    寄存器DI称为目的变址寄存器(Destination Index)。

    二、段寄存器

    段寄存器是因为对内存的分段管理而设置的。(存储单元的内容采用“高高低低”的原则来存放数据)

    段寄存器 说明
    指令指针寄存器(Instruction Pointer)IP用来存储将要执行的下一条指令的偏移量
    代码段寄存器(Code Segment)CS

    一般用于存放代码;

     通常和IP 使用用于处理下一条执行的代码

    数据段寄存器(Data Segment)DS

    般用于存放数据;

    ds地址对应的数据 相当于c语言中的全局变量

    堆栈段寄存器(Stack Segment)SS

    一般作为栈使用 和sp搭档;

    ss地址对应的数据 相当于c语言中的局部变量
    ss相当于堆栈段的首地址  sp相当于堆栈段的偏移地址

    附加段寄存器(Extra Segment)ES扩展段寄存器
     FS扩展段寄存器 (FS、GS 是从 32位CPU 80386 开始增加的,没有全称)
     GS扩展段寄存器
    标志寄存器(Flags)Flags表现微处理器当前状态和某些控制

    16位CPU 段寄存器

    16位CPU有四个段寄存器,其程序可同时访问四个不同含义的段。段寄存器及其偏移量的引用关系如图所示。

    段寄存器CS指向存放程序的内存段,IP是用来存放下条待执行的指令在该段的偏移量,把它们合在一起可在该内存段内取到下次要执行的指令。

    段寄存器DS指向数据段,ES指向附加段,在存取操作数时,二者之一和一个偏移量合并就可得到存储单元的物理地址。该偏移量可以是具体数值、符号地址和指针寄存器的值等之一,具体情况将由指令的寻址方式来决定。

    段寄存器SS指向用于堆栈的内存段,SP是用来指向该堆栈的栈顶,把它们合在一起可访问栈顶单元。另外,当偏移量用到了指针寄存器BP,则其缺省的段寄存器也是SS,并且用BP可访问整个堆栈,不仅仅是只访问栈顶。

    通常,缺省的数据段寄存器是DS,只有一个例外,即:在进行串操作时,其目的地址的段寄存器规定为ES。当然,在一般指令中,我们还可以用强置前缀的方法来改变操作数的段寄存器。

    32位CPU 段寄存器

    32位CPU内有6个段寄存器,程序在某一时刻可访问6个不同的段。其段寄存器的值在不同的方式下具有不同的含义:
    (1)、在实方式下,段寄存器的值就是段地址;
    (2)、在保护方式下,段寄存器的值不是段地址,是段地址的“选择器”。它间接指出一个32位的段地址。

    代码段寄存器:32位微机在取指令时,系统自动引用CS和EIP来取出下条指令。
                             在实方式下,由于段的最大容量不超过64K,所以,EIP的高16位全为0,其效果相当于16位CPU中的IP。

    堆栈段寄存器:32位微机在访问堆栈段时,总是引用堆栈段寄存器SS。但在不同的方式下其堆栈指针有所不同:
                (1)、在实方式下,32位微机把ESP的低16位SP作为指向堆栈的指针,所以,我们可以认为栈顶单元是由SS和SP来指定的。这就与16位微机访问栈顶单元的方法相一致;
                (2)、在保护方式下,堆栈指针可用32位的ESP和16位的SP。

    数据段寄存器:DS是主要的数据段寄存器。通常情况下,它是除访问堆栈以外数据时的默认段寄存器。在某些串操作中,其目的操作数的段寄存器被指定为ES是另一个例外。

    另外,段寄存器CS、SS、ES、FS和GS也都可以作为访问数据时的段寄存器,但它们必须用段超越前缀的方式在指令中直接写出。用这种方式会增加指令的长度,指令的执行时间也有所延长。

    一般来说,程序频繁访问的数据段用DS来指向,不太经常访问的数据段可用ES、FS和GS等来指向。
     

    段寄存器及其指针寄存器的引用关系

    访问存储器方式缺省的段寄存器可选用的段寄存器偏移量
    取指令CS IP
    堆栈操作SS SP
    一般取操作数DSCS、ES、SS有效地址
    串操作

    源操作数

    DSCS、ES、SSSI

    目标操作数

    ES DI

    使用指针寄存器BP

    SSCS、DS、ES有效地址

    由上表可以看出16位CPU在段寄存器的引用方面有如下规定:
    1、取指令所用的段寄存器和偏移量一定是用CS和IP;
    2、堆栈操作所用的段寄存器和偏移量一定是SS和SP;
    3、串操作的目标操作数所用的段寄存器和偏移量一定是ES和DI;
    4、其它情况,段寄存器除了其默认引用的寄存器外,还可以强行改变为其它段寄存器。

    展开全文
  • 寄存器

    2020-02-23 21:24:19
    四种寄存器容量都为两个字节,是十六位寄存器,表示范围0-65535,216 上述四种寄存器都可以分割成对应的2个8位寄存器, AX = AH + AL,高八位成为AH寄存器,H是high的意思,低八位是AL寄存器,L是low的意思 BX = BH...

    通用寄存器

    1. AX,BX,CX,DX,是四种通用寄存器,用于保存数据,是数据寄存器
    2. 四种寄存器容量都为两个字节,是十六位寄存器,表示范围0-65535,216
    3. 上述四种寄存器都可以分割成对应的2个8位寄存器,
      • AX = AH + AL,高八位成为AH寄存器,H是high的意思,低八位是AL寄存器,L是low的意思
      • BX = BH + BL
      • CX = CH + CL
      • DX = DH + DL
        上述的八位寄存器,表示范围0-255
    4. 将16位寄存器分为两种寄存器:
      • 为了兼容性,低位寄存器是为了保证原先的八位的就程序也能够读取,原先的CPU仅仅有八位寄存器去书写程序
      • 8X86CPU一共有16条数据线,一次可以处理8位数据和16位数据,两种数据
    5. 8位数据,字节型数据 byte = 8 bits;16位数据,字型数据,2 byte = 16bits,一个字型数据有两个字节型数据构成,分别是高位字节和低位字节,高位字节存在AH,BH,CH,DH,低位字节存放在AL,BL,CL,DL
    寄存位实验
    寄存器实验1,移动数据
    1. 在用寄存器移动数据时,数据的位数要和寄存器的容量相适应,AX寄存器是16位寄存器,对应的应该是四个16位进制的数字,不能够将AL八位寄存器的数据转移到十六位寄存器中去,同样的,也不可以将AX16位寄存器中的数据直接传给AL8位寄存器中去在这里插入图片描述
    寄存器实验二,加法

    八位寄存器,进行八位运算,并不会将多出来的位进到高位寄存器中去,仅仅只会自动清零,然后再接着运算,在这里插入图片描述

    总结:
    1. 寄存器是相互独立的,并不会出现进位的,如果八位计算超出了八位,那就仅仅保存最后的八位,多余的消失。
    2. 寄存器的加法是与位数相关的,八位寄存器和八位寄存器相加,十六位寄存器和十六位寄存器相加。八位相加出现多于八位,仅保留八位。
    3. 基本操作 a——输入基本的指令
      * r——展示寄存器的值

    地址寄存器

    1. 基本操作 摁“r”,然后在摁“d”,显示出对应的寄存器
      在这里插入图片描述
    2. 073F:0100》》段地址:偏移地址
      • 段地址:DS,ES,CS,SS
      • 偏移地址:SP,BP,SI,DI,IP,BX
    3. 寄存器的位数是16位,但是CPU是有20根地址线,寄存器的表达局限性,限制了CPU的寻址能力,为了让16位能够表达二十位,就出现了地址加法器,地址的计算方式,将十六位表达,变成二十位表达。
      • 地址加法器:段地址 X 16 (十进制的16,10H在十六进制之下) + 偏移地址 = 物理地址
      • 段地址 X 16 = 基础地址(就是往后移了一位,扩大了一位,使之能够满足二十位的需求),基础地址 + 偏移地址 = 物理地址
        在这里插入图片描述
    4. 实际操作:一个最终的物理地址只要满足公式,都可以找到同样的物理地址,段地址的范围是0 - ffff,只要满足公式,那么最终到达的物理地址都是相同的。
      在这里插入图片描述
    练习题

    有一个数据放在内存为20000H的单元格,现在给段地址位SA,若想将偏移地址寻找到此单元格,则SA应该满足的条件最小:10H,最大1001H,这是一个问题,十六位的范围:0 - FFFF,始终少了一个一,而整除的时候会自动舍弃末位的1,所以不可取。
    在这里插入图片描述

    CPU如何区分数据和指令

    1. u指令:将某个内存地址开始的字节,全部当作指令
    2. d指令:将某个内存地址开始的字节,全部当作数据
      • 两次相同的地址,但是是完全不同的指令,显示的结果也不同
        在这里插入图片描述
    3. r + 空格 + ds,修改对应的段地址寄存器的值;r 显示CPU中所有寄存器的值。:在这里插入图片描述
    4. 虽说内存中的数据和指令是一致的,但是CPU还是能够区分出来,CPU是将CS:IP地址所指向的内容全部当作指令来执行。
      在这里插入图片描述
      在这里插入图片描述
      在8086CPU,在任意时刻,CPU将CS:IP所指向的内容,全部当作指令去执行
    实验——CPU区分指令和数据

    在这里插入图片描述
    将我输入的对应的二进制代码,变成对应的命令去执行,修改CS:IP的地址,让其去执行对应的输入的代码,用e指令修改2000:0的地址,使其为下列相关的地址,去执行。
    在这里插入图片描述

    执行之后,指令行左侧地址已经改变,读取地址,就按照地址里的数据进行执行,问题在于,平常读取数据难道会切换吗?
    在这里插入图片描述
    为什么每一次u都是不一样的,难道再写入数据吗?

    指令执行的过程

    1. CPU从CS:IP所指向的内存单元中读取指令,存放到指令缓存器中去
    2. IP = IP + 所读指令的长度,从而指向下一条指令
    3. 执行指令缓存器中的内容,回到步骤一

    IP寄存器指令的长度关系
    在这里插入图片描述
    在2000:0中输入如下的数字在这里插入图片描述
    修改控制寄存器的命令,然后进行运算。第一次运算,是以b8204e作为第一个控制指令开始计算的,mov占了三个字节,下一次执行,ip的值就会加3。
    在这里插入图片描述
    在这里插入图片描述
    分别对应的是:
    CS:IP 当前控制符的对应的字符串 控制指令 操作的数据
    问题是:操作的数据从哪里来?
    第一次执行
    在这里插入图片描述
    第二次执行
    在这里插入图片描述

    下述显示的是073F:0100对应的数据形式

    在这里插入图片描述

    下述显示的是073F:0100对应的汇编指令的形式

    在这里插入图片描述

    下述时开始运行

    未运行时在这里插入图片描述
    在这里插入图片描述

    JMP指令

    1. 转移指令,可以修改CS和IP这两个寄存器,决定了CPU从哪里读取数据
    展开全文
  • 最早先的单片机internal RAM只有128字节,而特殊功能寄存器SFR不在internal RAM上,它们是属于很多其它不同的模块,为了方便访问,才把它们编在internal高128字节上。 后来人们发现internal RAM128不够用了,想扩展...
  • 理解CPU/寄存器/内存之间的关系

    万次阅读 多人点赞 2018-10-08 23:35:35
    CPU/寄存器/内存  因为要了解多线程,自然少不了一些硬件知识的科普,我没有系统学习过硬件知识,仅仅是从书上以及网络上看来的,如果有错误请指出来。  CPU,全名Central Processing Unit(中央处理器)。这是...
  • 寄存器和存储器

    万次阅读 多人点赞 2018-04-12 12:43:48
    内核的分类可分为单内核双内核以及微内核。严格地说,内核并不是计算机系统中必要的组成部分,附一张内核体系结构照片 可以看到内核所处的位置: CPU 中央处理器(CPU,Central Proce...
  • 单片机S52片内RAM高128H字节和特殊功能寄存器各自的物理空间分别哪里,不是说他们的分处不同的物理区域吗 就是复在不同的物理区域,但地制址相同2113(编址重复),访问方5261式结构有所不同4102; 高128是...
  • 1.CPU从当前的CSIP指向的内存单元读取指令,然后将读取的指令进入到指令缓冲器(CPU中保存指令的地方)中。 2.改变IP寄存器的内容。IP = IP +所读指令的字节数(长度),从而指向下一条指令。 3.执行指令缓冲器中...
  • 【汇编语言】寄存器和地址

    千次阅读 多人点赞 2021-03-04 18:40:57
    寄存器和地址 主要内容: 一、寄存器 (1)透明寄存器 (2)可编程寄存器 1.通用寄存器 2.专用寄存器 二、地址 (1)存储模型 (2)存储空间分段管理 (3)物理地址与逻辑地址 (4)操作数寻址过程
  • 单片机有寄存器和内存。 内存就是RAM、ROM/FLASH,这里的内存的概念电脑的不太一样,不要搞混,眼着于单片机即可。 ROM/FLASH:程序存储区(只读存储器),不变的东西都存这俩里头,并且存里头的东西只读。 RAM:...
  • [从零学习汇编语言] -寄存器详解

    千次阅读 多人点赞 2021-10-27 20:58:07
    上一章我们曾简单的介绍过计算机中的一些硬件软件的相关概念,还不熟悉的小伙伴可以点击下面的链接进行预习: [汇编语言] - 汇编语言基础知识梳理 一、 存储器与通用寄存器 1. 存储器 每一天清晨,当我们在梦中...
  • 寄存器和RAM之间的区别

    千次阅读 2020-06-23 00:02:07
    寄存器和RAM之间的区别概述寄存器CPU上的通用寄存器外围功能的控制寄存器RAM可以放入任意数据可以按顺序保存大量数据逻辑构成与C编译器的关系 概述 寄存器是“存储设备”,主要用于存储检查微型计算机的状态。 ...
  • 若与电脑类比,内核与外设就如同电脑上的CPU主板、内存、显卡、硬盘的关系。 STM32F103采用的是Cortex-M3内核,内核即CPU,由ARM公司设计,ARM公司并不生产芯片,而是出售其芯片技术授权。芯片生产厂商(SOC)如...
  • (1)寄存器

    2021-08-30 20:09:28
    内部总线实现CPU内部各个器件之间的联系,外部总线实现CPU主板上其他器件的联系。 在CPU中: 运算器进行信息处理 寄存器进行信息存储 控制器控制各种器件进行工作 内部总线连接各种器件,在他们之间进行数据的...
  • 这篇文章主要介绍了汇编语言存储及寄存器原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下字的存储一个16位寄存器可以存放一个字(16位)或者一个字节(8位...
  • 51单片机的IO口和寄存器

    千次阅读 2020-07-10 16:21:34
    可是程序是软件,而这些管脚是硬件,它们之间有啥关系啊?这就是涉及到51单片机的内部结构了,学过数字电子技术的同学知道,集成电路的结构太复杂了,简单的逻辑与或非还行,什么锁存器、时序电路、组合电路简直让人...
  • 学习汇编语言,首先必须了解两个知识点:寄存器和内存模型。 先来看寄存器。CPU 本身只负责运算,不负责储存数据。数据一般都储存在内存之中,CPU 要用的时候就去内存读写数据。但是,CPU 的运算速度远高于内存的...
  • 00000000 00000000 00000000...|=EAX=|—32个0,4个字节,2个字,1个双字 |AX=|—16个0,2个字节,1个字 |AH=|-----------8个0,1个字节 |=AL|—8个0,1个字节 AX,AH,AL AH是AX的高8位,AL是AX的低8位 AX是EAX的低16位 ...
  • 四个通用寄存器:AX,BX,CX,DX

    千次阅读 2021-07-04 15:40:34
    一、AX,BX,CX,DX寄存器作用 ...因为8086CPU寄存器是16位结构,所以一个寄存器可以存放两个字节,同时为了兼容性,这四个寄存器中每一个寄存器也可以单独分为两个独立的寄存器。即AX=AH(高八位)+AL
  • 这其实是Modbus协议的数据模型地址模型。 Modbus协议的数据模型 数据模型是对从站设备可访问的数据进行抽象,Modbus协议的数据模型定义了四种可访问的数据: 数据区块 数据类型 ...
  • 寄存器和

    2016-10-30 10:52:13
    结论:任何两个地址连续的内存单元,NN+1号单元,可以将他们看作2个内存单元,也可以看成一个地址为N的字单元的高位字节单元低位字节单元。2、DS地址 在8086PC中,内存地址由段地址偏移地址组成; 8086CPU中...
  • STM32寄存器的简介、地址查找,与直接操作寄存器

    万次阅读 多人点赞 2019-01-11 11:15:15
    寄存器是有限存贮容量的高速存贮部件,它们可用来暂存指令、数据地址。  简单来说,寄存器就是存放东西的东西。从名字来看,跟火车站寄存行李的地方好像是有关系的。只不过火车站行李寄存处,存放的行李;寄存器...
  • 汇编----寄存器

    千次阅读 2022-04-21 08:21:53
    寄存器-它有什么分类?又该怎么操作?
  • 内存、寄存器、GPIO地址、存储器之间的关系1、如上图,0x0000 0000表示第一个地址字节,代码使用这个16进制时,指针会指向这个物理地址,对4字节的GPIO控制单元来说,这4个字节的物理地址就叫寄存器,当我们把IO口...
  • MODBUS-寄存器与功能码学习

    千次阅读 2018-10-26 14:35:25
     首先是定义的寄存器地址范围,应结合不同单片机RAM的大小项目得实际需求定义起始范围大小。方法如在RAM区的不同区域定义不同功能的数组: IOX[N]:输出线圈,用来进行继电器的操作 IX[M]:开关输入 ,...
  • 字节数据地址之间的关系

    万次阅读 2018-09-03 18:33:56
    字节 (byte) 习惯用B来表示 1byte=8bit 地址值 :变量占用空间的起始地址,地址值由分配时决定,之后不再改变直到变量撤销。地址值是一个常量 int a; int *p=&a; a=1 &a=0x23 int * ...
  • cpu与寄存器

    2020-08-01 15:29:44
    累加寄存器:储存运行的数据运算后的数据。 标志寄存器:用于反应处理器的状态运算结果的某些特征以及控制指令的运行。 程序计数器:程序计数器是用于存放下一条指令所在单元的地址的地方。 基址寄存器:储存...
  • 寄存器类别用途 基本程序执行寄存器(basic program execution registers)。8 个通用寄存器,6 个段...同样的重叠关系也存在于 EAX、EBX、ECX EDX 寄存器中: 32 位 16 位 8 位(高) 8 位(低)

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 75,215
精华内容 30,086
关键字:

寄存器和字节的关系