精华内容
下载资源
问答
  • 一条指令执行的步骤

    千次阅读 2020-02-23 18:45:57
    指令分为两个部分:“操作码”“地址码”,现在假设你写好一个程序,在程序开始执行前,必须将它的起始地址,即程序的一条指令所在的内存单元地址送入PC,因此程序计数器(PC)的内容即是从内存提取的第一条指令的...

    这里是关于C++程序设计的实验课程第三个实验:一条指令执行的步骤分析图解

    为了强化大家的理论知识巩固,在讲解词语时候也会有问题提出来巩固。

    在这里插入图片描述

    指令分为两个部分:“操作码”“地址码”,现在假设你写好一个程序,在程序开始执行前,必须将它的起始地址,即程序的一条指令所在的内存单元地址送入PC,因此程序计数器(PC)的内容即是从内存提取的第一条指令的地址。
    程序计数器(PC):为了保证程序(在操作系统中理解为进程)能够连续地执行下去,CPU必须具有某些手段来确定下一条指令的地址。而程序计数器正是起到这种作用,所以通常又称为指令计数器。
    在程序开始执行前,必须将它的起始地址,即程序的一条指令所在的内存单元地址送入PC,因此程序计数器(PC)的内容即是从内存提取的第一条指令的地址。在这里插入图片描述

    总结:先是PC存储第一条指令,即从内存提取的第一条指令。

    • 在程序中存放指令地址的寄存器叫( )

    A通用寄存器
    B 程序计数器
    C变址寄存器
    D指令寄存器
    答案为:D
    解析:程序计数器存放的是下一条指令所在单元的地址,指令寄存器存放正在执行的指令。(除了执行第一次指令以外,都是存放下一条指令所在单元的地址)

    程序一开始会根据PC存储的指令的内存地址(简称:指令地址),根据地址取出后放在指令寄存器中,图中指令寄存器是0001 110100 110110=加法指令的代码,因为实验在浏览器表现不太好,把两部分数字倒过来了,实际上应该是在这里插入图片描述在这里插入图片描述这样子的
    然后上下图比较后我们可以看到PC多加了一个1,这是为什么?
    答案是因为当执行指令时,CPU将自动修改PC的内容,即每执行一条指令PC增加一个量,这个量等于指令所含的字节数,以便使其保持的总是将要执行的下一条指令的地址。由于大多数指令都是按顺序来执行的,所以修改的过程通常只是简单的对PC加1。 当程序转移时,转移指令执行的最终结果就是要改变PC的值,此PC值就是转去的地址,以此实现转移。有些机器中也称PC为指令指针IP(Instruction Pointer)
    但在这里我要强调一句,这里PC加1不是单纯加1,它是根据先前的指针地址继续加上指令的字节数,因为这里的地址是按字节排序,即0x000A+1=0x000B…从而继续执行下一条指令。如果说一个指令占据两个字节,你可以这样想:执行完一条指令后,下一条指令的地址是多少???是刚刚被执行完的指令地址加上2,也正是因为这个可以继续执行指令。

    AR=0X000A=10=1010 因为0X是十六进制的标记,后面数字全当做十六进制处理,然后转化成二进制

    在这里插入图片描述这里是要把操作码放在CU以此来判断要干啥?(加减乘除之类的)判断后它就能知道后面的执行操作决定用什么工具。

    • 控制器(CU)的功能是______。

    A) 指挥计算机各部件自动、协调一致地工作
    B) 对数据进行算术运算或逻辑运算
    C) 控制对指令的读取和译码
    D) 控制数据的输入和输出
    答案:A
    解析:控制器的主要功能是指挥全机各个部件自动、协调的工作。
    在这里插入图片描述这一段是因为IR里面的值0001 110100 110110的其中110100是0X0034的值,也是我们输入的值的地址(这里我要说的是0X0034这个地址对应的是我输入的值的内存单元),同理,110110也是0X0036的值,对应着我输入的第二个值,然后存在数据缓冲寄存器(DR)中
    在这里插入图片描述
    在这里插入图片描述
    经过累加器ALU的加法计算,得出结果并存储在第一个值存储的位置——数据缓冲寄存器(DR)

    • 在CPU中 数据寄存器DR是指?

    A.可存放指令的寄存器
    B.可存放程序状态字的寄存器
    C.本身具有技术逻辑于移位逻辑的寄存器
    D.可编程指定多种功能的寄存器
    答案:C
    解析:A是指令寄存器IR B是程序状态寄存器PSW D是通用寄存器
    在这里插入图片描述以上,就是我对一条指令执行的步骤总过程实验的书面描写心得。

    如果这段描述有帮到你,请记得点赞并关注哟!
    在这里插入图片描述

    展开全文
  • 以前使用串口,流程好控制,都是同步的:发送-->等待N毫秒-->接收数据-->处理数据,现在要改成网口,可是socket的发送和接收不在一个方法中,导致我没法实现上一条指令接收完成后(result=true)才允许发送下一条指令...
  • 开机后的第一条指令

    千次阅读 2016-01-26 13:45:57
    关于电脑加电后的第一条指令,有很多人在网络上问过,但解答并不是那么的清晰,csdn论坛上也有很多这类的讨论帖, 例如:CPU在RSET后的第一条执行指令的地址问题、请教x86的启动过程,cpu如何自举第一条指令? 、...

    关于电脑加电后的第一条指令,有很多人在网络上问过,但解答并不是那么的清晰,csdn论坛上也有很多这类的讨论帖,

    例如:CPU在RSET后的第一条执行指令的地址问题请教x86的启动过程,cpu如何自举第一条指令? 、开机第一条指令是如何取到和执行的?

    存在问题的地方大概是这么几点:

    1.第一条指令的地址是什么

    2.第一条指令的地址为什么是0xFFFFFFF0

    3.第一条指令存储在什么地方

    4.BIOS代码块映射在什么位置

    5.第一条指令的内容是什么


    然后挨个解答。。。。。。。

    ----------------------------------------------------------------------------------------------------------------------------------------------------------

    一、第一条指令的地址是什么

    这个问题网上有两种解答,0xFFFFFFF0,0xFFFF0。当然第一种是对的,这个在intel手册第三卷第9章有详细说明,第一条指令的地址为0xFFFFFFF0

    这个地址自从intel发布80386后就延续下来


    第二种地址在早年间也是对的,在intel还在使用16位cpu的时候,8086,8088,地址空间为1M,第一条指令的地址就是0xFFFF0了,回答这种地址的应该看的是早年的书,现在pc机已经不再使用了这是加电后寄存器的初始值

    又或者是拿16位实模式说事,PC刚开机时确是16位实模式,这种模式的地址计算方式是使用CS和EIP寄存器中的值(Selector*16+EIP),这么算下来确实是0xFFFF0。但是刚开机时并不是使用这种计算方式,虽然还在16位模式。但intel规定的是当CS中的初始值被改变后才使用这种一般的地址计算方式。未改变之前用Base+EIP来生成地址,所以还是0xFFFFFFF0

    原文:



    ----------------------------------------------------------------------------------------------------------------------------------------------------------

    二、第一条指令的地址为什么是0xFFFFFFF0

    这个也没为什么,当初就这么设定了,人为规定


    ----------------------------------------------------------------------------------------------------------------------------------------------------------

    三、第一条指令存储在什么地方

    也有很多人问这个问题,指令肯定是在EPROM中了,刚开机时内存中什么都没。


    ----------------------------------------------------------------------------------------------------------------------------------------------------------

    四、BIOS代码块映射在什么位置

    BIOS代码肯定是储存在EPROM中的,这时cpu如何访问?靠地址映射,硬件会把EPROM映

    射在两个地方,一个是从0xFFFFFFFF(4GB)处向下扩展,一个是从0xFFFFF(1MB)处向下扩


    第一个映射是因为第一条指令在0xFFFFFFF0,所以EPROM必须在那个位置。第二个映射是为了兼容,在16位时代就有了。

    另外地址映射是占据地址空间,所以纵使你的pc机只有2G内存也没事,因为并没用内存,

    使用的只是地址空间,只是把那块地址分配给了EPROM。这也就是为什么32位系统只

    能使用4G内存,因为32位下只有4G的地址空间,内存再大就没地址分配了,所以读

    取不到了。

    另外好多人会碰到这个占用过大,这也是地址空间的问题。网上好多人发帖用

    什么系统32位换64位,一会又设置msconfig,只能说Go play with your balls。。。如果系统本来

    就是64位呢,还要换128位么敲打。这就是硬件厂家把显卡或是别的什么rom,ram区给映射到了常用的地址

    空间,地址空间一占,内存就没得用了,所以就保留了,至于占用过大还是换电脑把。


    ----------------------------------------------------------------------------------------------------------------------------------------------------------

    五、第一条指令的内容是什么

    这个也是比较容易混乱的地方,大多数人说第一条指令是个长跳转(long jmp),跳转到0~0xFFFFF(0~1MB)这一段,然后再执行BIOS剩余的指令。然而又有一部分人看到intel手册第3卷的9.1.4节有这么一段话


    这里又说不让有长跳转。其实两种都对,intel手册上说的是让BIOS在高地址空间运行,期间一直不修改CS寄存器,也就一直使用Base+EIP的方式生成地址,这种新式做法应该是UEFI的

    那种刚开始就长跳转的属于老式做法,

    在qemu中导出的第一条汇编指令是这个样子0xfffffff0:  ljmp   $0xf000,$0xe05b

    展开全文
  • CPU加电执行的第一条指令

    千次阅读 2019-04-10 01:16:14
    当按下开关时,刚开始电压不稳定,主板会给cpu发出并保持RESET信号,rangCPU自动恢复到初 始状态,当芯片组检测到稳定供电时,便撤去了RESET信号,CPU开始执行第一条指令. 2.第一条指令在哪? 首先可以肯定的是刚加电是RAM...

    参考了member82的这篇博客

    当按下开关时,刚开始电压不稳定,主板会给cpu发出并保持RESET信号,rangCPU自动恢复到初 始状态,当芯片组检测到稳定供电时,便撤去了RESET信号,CPU开始执行第一条指令.

    2.第一条指令在哪?

    首先可以肯定的是刚加电是RAM是没有内容的,所以第一条指令一定是在ROM上.
    cpu想要执行ROM中的代码,靠的就是地址映射,硬件会把EPROM映射在两个地方,一个是0XFFFFFFFF(4GB)向下扩展,一个是从0XFFFFF(1MB)向下扩展
    值得 注意的是:地址映射只是占用了地址空间,并没有使用内存,只是将那块的内存地址分配给了ROM.
    ####

    2.第一条地址是什么?

    0XFFFFFFF0H 是对的,它是物理地址空间的最高16个Byte.
    0FFFF0H也是对的,这是对于早期的8086,8088处理器的16位机时代 ,最高的16个Byte就是从 0FFFF0H开始的

    3.第一条指令的内容是什么?

    从0FFFFFFF0~0FFFFFFFF的十六个字节分配为ROM地址,执行ROM里面的第一条FAR JMP(子0xfffffff0: ljmp $0xf000,$0xe05b)指令,长跳转至1MB以下,即就是BIOS第一条指令,这样CPU就可以继续执行BIOS中的代码
    8086:CPU reset之后cs寄存器的值是0xFFFF,ip寄存器的值是0x0,所以形成的物理地址是0xFFFF0,这个地址就是1M往下16字节的位置


    80286:CPU reset之后cs寄存器的值是0xF000,ip寄存器的值是0xFFF0,所以形成的物理地址也是0xFFFF0
    80386:到了386时代一切都变了,此时在CPU reset之后cs寄存器的值仍然是0xF000,但是cs除了段选择子之外还有一个隐藏的基址寄存器,这个寄存器的值是0xFFFF0000,ip寄存器的值仍然是0xFFF0。此时的地址不在是0xF000左移4位加上0xFFF0了,而是0xFFFF0000 + 0xFFF0 = 0xFFFFFFF0。所以第一条指令是在一个很高的地址,是4G往下16字节的位置。


    展开全文
  • BIOS/UEFI基础——第一条指令

    千次阅读 2016-06-09 22:48:23
    BIOS/UEFI基础——第一条指令

    Reset Vector

    本文讲述Intel x86系统启动后执行的最初的指令。

    在Intel提供的软件开发者手册《64 ia 32 architectures softerware developer manual》中,有一个小节”First Instruction Executed“专门讲述系统中第一条指令的位置。

    上面的文字简单来说阐明了以下的几点:

    1. 第一条指令在的位置是0xFFFFFFF0(这个地址有个专有的名称Reset Vector);

    2. 解释了CPU起来后是实地址模式为什么能够访问到这么高的位置;

    3. 因为2的原因,在最初的代码中不应该有far jump等改变CS值的操作。

     

    具体代码

    Reset Vector的位置确定后,就可以在这个位置放上我们需要执行的代码。

    CPU将这个位置映射到了某些非易失介质上了,比如SpiFlash,而这个介质里面保存着BIOS二进制。(前面这种说法不知道是哪里看来的,准确性不可考了,或者是以前的BIOS的特性。目前的UEFI来说,一般是TXE加载非易失性介质中的BIOS的起始代码部分到SRAM中,而SRAM映射到了从4G往下的一段区域中,这同样保证了Reset Vector 的位置是在0xFFFFFFF0

    这里以UEFI代码为例。

    UEFI代码按照一定的格式放在二进制中,在Reset Vector指向的位置,放的是SEC阶段的代码,它们是未经过压缩的机器码,CPU可以直接拿来执行。

    对应到具体代码,如下:

    ;------------------------------------------------------------------------------
    ; @file
    ; This file includes all other code files to assemble the reset vector code
    ;
    ; Copyright (c) 2008 - 2013, Intel Corporation. All rights reserved.<BR>
    ; This program and the accompanying materials
    ; are licensed and made available under the terms and conditions of the BSD License
    ; which accompanies this distribution.  The full text of the license may be found at
    ; http://opensource.org/licenses/bsd-license.php
    ;
    ; THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
    ; WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
    ;
    ;------------------------------------------------------------------------------
    
    ;
    ; If neither ARCH_IA32 nor ARCH_X64 are defined, then try to include
    ; Base.h to use the C pre-processor to determine the architecture.
    ;
    %ifndef ARCH_IA32
      %ifndef ARCH_X64
        #include <Base.h>
        #if defined (MDE_CPU_IA32)
          %define ARCH_IA32
        #elif defined (MDE_CPU_X64)
          %define ARCH_X64
        #endif
      %endif
    %endif
    
    %ifdef ARCH_IA32
      %ifdef ARCH_X64
        %error "Only one of ARCH_IA32 or ARCH_X64 can be defined."
      %endif
    %elifdef ARCH_X64
    %else
      %error "Either ARCH_IA32 or ARCH_X64 must be defined."
    %endif
    
    %include "CommonMacros.inc"
    
    %include "PostCodes.inc"
    
    %ifdef DEBUG_PORT80
      %include "Port80Debug.asm"
    %elifdef DEBUG_SERIAL
      %include "SerialDebug.asm"
    %else
      %include "DebugDisabled.asm"
    %endif
    
    %include "Ia32/SearchForBfvBase.asm"
    %include "Ia32/SearchForSecEntry.asm"
    
    %ifdef ARCH_X64
    %include "Ia32/Flat32ToFlat64.asm"
    %include "Ia32/PageTables64.asm"
    %endif
    
    %include "Ia16/Real16ToFlat32.asm"
    %include "Ia16/Init16.asm"
    
    %include "Main.asm"
    
    %include "Ia16/ResetVectorVtf0.asm"

    上面的代码是用nasm写的汇编。

    实际上这里也没有涉及到具体的执行代码,真正重要的是ResetVectorVtf0.asm,其中有这样的代码:

    resetVector:
    ;
    ; Reset Vector
    ;
    ; This is where the processor will begin execution
    ;
        nop
        nop
        jmp     EarlyBspInitReal16
    
    ALIGN   16

    这段代码被写到了UEFI二进制的最后一行,刚好对应0xFFFFFFF0的位置,下面是实际二进制中的值:

    90 90 E9 AB FF 90 90 90 90 90 90 90 90 90 90 90

    前面的90h就是nop的机器码,而后面的E9h ABh FFh是跳转指令的机器码。

    跳转到EarlyBspInintReal16的代码去执行。

    UEFI的执行过程一般被分为SEC、PEI、DXE和BDS四个阶段。

    而这里的代码实际上还在SEC阶段之前,它最终会知道SEC entry并跳入,之后大部分就是C语言代码了。

     

    展开全文
  • 计算机开机第一条指令地址

    千次阅读 2016-12-08 11:12:55
    前提本文针对x86架构的处理器。在正式开始之前,首先需要明确一些基本概念。...reset vector:就是CPU执行的第一条指令的位置地址构成其实随着x86的发展,第一条指令的地址并不是一成不变的 8086:C
  • 处理器一条指令需要几个时钟周期?

    万次阅读 多人点赞 2016-03-30 19:47:42
    思考个小问题,处理器执行一条指令需要几个时钟周期。 对于软件工程师来说,印象流我们可能会觉得执行一条指令一个时钟周期嘛,一条指令算是一个最小的原子操作,不可能再细分了吧。 如果看看诸如《see mips run》...
  • CPU执行的第一条指令地址

    千次阅读 2019-07-24 13:35:20
    一条指令(ResetVector) 先说结论:X86 CPU启动后,将从地址0xFFFFFFF0处开始执行(此地址并非内存地址。此时,内存还远远没有初始化。)。这一章来看X86系统是如何实现这一点的。 加电或者RESET针脚被激发...
  • 主机完成一条指令的过程 取数指令:        机器启动后,PC是一开始存放指令的部件(程序计数器,用来存放当前欲执行指令的地址),PC要将指令的地址送到MAR(存储器地址寄存器,用来存放欲访问...
  • reset后的第一条指令

    千次阅读 2015-01-11 22:15:05
    问题提出: 开机后第一条指令是在实模式,real address mode. 可是第一条指令是在FFFFFFF0处抓到的。那么问题来了,实模式可访问的地址窨是1M 。FFFFFFF0 是远远大于1M的,那Intel 是怎么做到的呢? 首先把ia 32 ...
  • Coursera:计算机一条指令的执行过程

    千次阅读 2019-04-20 21:27:11
    一条指令执行需经过取指,译码,执行,回写四个步骤。 取指 :PC —》MAR—》地址译码器 同时:CPU控制器通过控制电路的控制总线–》控制逻辑read 然后地址译码器读出PC0001对应的存储单元,10101010 通过MDR数据...
  • 计算机底层执行一条指令的过程

    千次阅读 2014-02-21 14:29:30
    计算机每执行一条指令都可分为三个阶段进行。即取指令-----分析指令-----执行指令。 取指令的任务是:根据程序计数器PC中的值从程序存储器读出现行指令,送到指令寄存器。 分析指令阶段的任务是:将指令寄
  • ARM上电取第一条指令流程

    千次阅读 2016-09-09 20:05:51
    1.1 上电后的第一条指令在哪里? 首先明确:对于ARM芯片,启动时pc值由CPU设计者规定,不同的ARM CPU有不同的值,例如S3C2440芯片上电后PC值被硬件设计者规定为0x0;其他ARM芯片不一定是0x0。 第一章讲述的上电取...
  • 一条指令的位置在FFFF:0000,也就是物理地址FFFF0。第一条指令是跳转到F000:EO5B。 接下来准备由实模式进入保护模式。加载GDT,置PE位为1,清指令预取队列并真正进入保护模式。 那么计算机一直更新换代,这种...
  • PC机启动后如何执行第一条指令

    千次阅读 2019-11-23 15:12:57
    在过去的三个月内,本人根据《linux内核设计的艺术》和《linux0.11内核完全注释》细读了linux-0.11源码中的大部分... 当我们按下开机按钮时,电脑是怎么开始执行第一条指令的? ①梦回40年前,当时的intel公司生产...
  • CPU执行第一条指令时情形

    千次阅读 2013-10-14 14:58:12
    CPU执行第一条指令时情形   cpu执行的第一条指令不在内存中,众所周知,内存是由ram组成的 ,而ram不断电,可以保存信息,一旦断电,ram中的信息将会丢失,所以cpu要执行的第一条指令被固化在...
  • 一条指令分条件向多个表插入数据

    千次阅读 2017-09-27 13:52:56
    一条指令分条件向多个表插入数据,可作为拆分表数据的操作参考
  • 预取是从cache或者内存取一系列的字节(大小可以保证至少包含一条指令),并设置一个待分析的位置,预分析从此位置逐字节分析,如果是前缀就设置分析状态(因为前缀可能改变默认地址尺寸和操作数的大小,影响后续...
  • CentOS各版本更换国内源,一条指令搞定,超简单! 前言 CentOS 有个很方便的软件安装工具yum,但是默认安装完CentOS,系统里使用的是国外的CentOS更新源,这就造成了我们使用默认更新源安装或者更新软件时速度很...
  • 我想问一下R型指令是通过什么特性实现单周期完成一条指令的。这张图想表现的延时该怎么实现![图片说明](https://img-ask.csdn.net/upload/201609/04/1472962909_703497.png)
  • 一条指令在cpu中的执行流程

    万次阅读 2014-05-22 15:57:25
    一条指令在cpu中的执行流程(理解CPU组成) CPU: 1.寄存器; 2.控制器CU(Control Unit):  指令寄存器IR(InstructionRegister)、程序计数器PC(ProgramCounter)和操作控制器OC(OperationController); 3....
  • 转载:ARM上电启动及Uboot代码分析 ...本文拟详细分析Uboot从上电,到第一条指令的执行,同时分析代码对于cache、TLB等部件的操作过程。 以下内容以u-boot-2012.04.01源码为例,从网上很容易下载该版本...
  • 请教各位大神,蓝牙是否能广播一条指令让多个蓝牙设备收到? 我想通过手机通过控制多个蓝牙灯,如何处理?在线等。
  • 一条指令安装fbprophet

    千次阅读 2019-05-08 10:34:59
    (现在这个链接访问不了了,我上传到了百度云,下载下来通过 rz -e的指令传到服务器上吧) 链接: https://pan.baidu.com/s/1mArjyfrnmLzl0V6cex4h9g 提取码: 8fqr bash Anaconda3-4.3.0-Linux-x86_64.sh ...
  • 为什么 __start 是处理器执行的第一条指令? 转载请注明出处:http://blog.csdn.net/zhumaill/article/details/23426605 在《NuttX 启动流程》一文中提到, __start 是处理器执行的第一条指令。那么,为什么在 ...
  • 一条指令的执行流程

    千次阅读 2019-07-24 22:21:02
    1. 将硬盘上的 程序 装入内存中,并将其首地址装到程序计数器() 2. 将 中的地址通过 指令地址总线 装入 地址寄存器(AR),然后将其送入地址总线,找到 主存单元中 对应地址的 ...
  • 指令指针寄存器IP:存放下一条指令的地址的偏移量 (下一条指令的地址,CS给出段基值+ip偏移地址,20位的物理地址) 标志寄存器FR:存放当前程序执行的状态,相加以后结果为0,溢出,符号位为正为负等。指令指针IP...
  • cpu执行的第一条指令不在内存中,众所周知,内存是由ram组成的 ,而ram不断电,可以保存信息,一旦断电,ram中的信息将会丢失,所以cpu要执行的第一条指令被固化在rom中以前8086年代,由于...
  • 前面几章介绍了很多预备知识,也描绘了即将要实现的OpenMIPS处理器的蓝图,各位读者是不是早已摩拳擦掌,迫切希望一展身手了,好吧,本章我们将实现OpenMIPS处理器的第一条指令ori,为什么选择这条指令作为我们实现...
  • 在Linux的命令行模式下我们经常会遇到即将输入的指令与上一条指令完全一致,而这时如果命令过于复杂或者为了节约时间提高效率,使用快捷键方式重复上一条指令。 以下列出四种常见的快捷键方式: ①Ctrl + P 这样的...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 26,540
精华内容 10,616
关键字:

一条指令