`
ackerman
  • 浏览: 75520 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

(转载)CPU如何区分读出的代码是指令还是数据

阅读更多

原文地址:http://blog.sina.com.cn/s/blog_4bef07470100fw4a.html

计算机可以从时间和空间两方面来区分指令和数据,在时间上,取指周期从内存中取出的是指令,而执行周期从内存取出或往内存中写入的是数据,在空间上,从内存中取出指令送控制器,而执行周期从内存从取的数据送运算器、往内存写入的数据也是来自于运算器。

比如:要计算机做1+2=?中,“+”表示要做什么和怎样做,1和2则是做的时候需要的原始数。现在假设某CPU中,“+”用二进制“00000001”来表示,“1、2”分别用“00000001、00000010”来表示。那么,这段程序存入内存中就是这样的:
XXXX1:00000001
XXXX2:00000001
XXXX3:00000010 前面的XXXX1 XXXX2
XXXX3表示内存的地址
  从上面可以看出,“+”指令和被加数是完全相同的,当然,这是我故意这样假设的,但是,在实际情况中,这种情况是大量存在的。在正常情况下,CPU只能把XXXX1内存中的00000001作为指令,XXXX2内存中的00000001作为被加数才能得到正确的结果。那么CPU如何才能做到不把第二个00000001也当成“+”呢?
  1.人们把内存的某个地址规定为起始地址(又称为复位地址),也就是说,当计算机开机或者被强行复位(也就是机箱上那个重启动按钮按下的的时候),CPU立即跳转到这个地址中,并且把它里面的代码作为指令来执行,同时根据这个指令的长度和格式判断下一条指令在什么地方。
  对于X86系列CPU(也就是现在人们常用的什么奔XX、赛XX系列),它的复位地址是FFFF0,如果表示成逻辑地址则是:FFFF:0000。对DEBUG比较熟悉的朋友或者会在一些高级语言中嵌入汇编语言的朋友可以这样做一个试验:
  用DEBUG执行一条指令(这是一条无条件跳转指令):jmp
FFFF:0000,或者在高级语言中嵌入这条汇编指令,执行后,你就会发现,计算机重新启动了(纯32位windows是不能进入实模式的,重启以后到载入WINDOWS以前都是实模式,只有实模式才能重启)。其实,用程序控制计算机重启的最本质的操作就是这样的。
  2.给各种指令规定了相应的长度和格式。比如:某数+某数这条指令就规定:这条指令的长度是3个字节,其中第一个字节表示“+”,后面两个字节表示被加数和加数。于是,当CPU到达这个指令后,就自动把第一个代码作为指令,后面两个代码作为数据,依次类推,第4个代码就必然是指令

CS(CodeString)指向的是指令段地址,指令段寄存器
DS(DataString)指向的是数据段地址,数据段寄存器
SS(StackString)指向的是栈顶段地址,栈段寄存器

CS指向的段地址里,存的是指令
DS指向的段地址里,存的是数据

数据和程序在内存中都是已2进制的数据存贮,只有当2进制的数据被CS:IP指向时,才成为可执行的指令或程序。CPU要执行CS中的指令 指令用到的数据可能就存放在DS中,你可以把数据放到CS 但是CPU并不把它当成数据来使用,你也可以把指令放到DS中,但是CPU根本不去DS里读指令。

 

分享到:
评论

相关推荐

    杭电计组实验9-实现R-I型指令的CPU设计实验.pdf

    在本实验中,学生将设计并实现一个基于R-I型指令的CPU。R-I型指令是一种常见的计算机指令格式...学生需要编写Verilog代码来实现这些功能,并通过仿真工具验证其正确性,确保CPU能够正确地执行R-I型指令集中的各种操作。

    MINIST数据+读出代码

    MINIST(Modified National Institute of Standards and Technology)是一个广泛使用的手写数字识别数据集,它对于初学者和专家来说都是一个极好的资源,用于理解和实践深度学习、机器学习以及计算机视觉领域的算法...

    349-将数据0x0f写入AT24C02再读出送P1口显示(51单片机C语言实例Proteus仿真和代码)

    349-将数据0x0f写入AT24C02再读出送P1口显示(51单片机C语言实例Proteus仿真和代码)349-将数据0x0f写入AT24C02再读出送P1口显示(51单片机C语言实例Proteus仿真和代码)349-将数据0x0f写入AT24C02再读出送P1口显示(51...

    将数据0xaa写入X5045再读出送P1口显示.rar

    标题中的“将数据0xaa写入X5045再读出送P1口显示”是一个典型的单片机编程任务,涉及到几个关键知识点,包括单片机基础、内存芯片X5045的操作以及端口I/O操作。下面将详细阐述这些概念。 1. **单片机**:单片机,也...

    计算机原理常见问题大全.doc

    在指令和数据取到 CPU 之前,它们都存放在存储器中,CPU 必须能够区分读出的是指令还是数据,如果是指令,CPU 会把指令的操作码送到指令译码器进行译码,而把指令的地址码送到相应的地方进行处理;如果是数据,则送...

    实验六实验报告模板 CPU组成与机器指令执行周期实验.docx

    - 数据总线(DBUS)在CPU和存储器之间传输数据,如指令和运算结果。在这个实验中,数据总线上的位数是8位,从D7到D0。 5. **地址总线**: - 地址总线(A Bus)用来指定存储单元的位置,如AR7到AR0指示了地址寄存器的...

    CPU烧板时,Basys3板的使用说明1

    Basys3板提供了四个七段数码显示器来显示关键的CPU信息,包括当前指令地址PC、下条指令地址PC、RS寄存器地址及数据、RT寄存器地址及数据以及ALU的结果输出。以下是对这些知识点的详细解释: 1. **当前指令地址PC...

    三菱PLC时钟写入与读出指令应用.doc

    2. **读取当前时间**:使用时钟读出指令(CR)读取PLC内部时钟的当前时间,并将其存储到指定的数据寄存器中。 ```plaintext CR D1002 D1003 ``` 其中,D1002用于存放年份,D1003用于存放其他时间信息。 3....

    CPU-hazard

    在计算机体系结构中,CPU(中央处理器)是执行指令并处理数据的核心部件。"CPU-hazard"是指在CPU执行指令时遇到的一些潜在问题,这些问题可能导致性能下降、数据错误或者指令执行顺序混乱。这些危害通常分为三类:...

    如何对单片机读出目标代码进行反汇编

    “51汇编集成开发环境”中集成有一个反汇编工具,该工具目前不支持对非0地址开始的部分代码进行反汇编,因为非0地址开始的部分代码无法区分程序和数据。 正确获取目标代码是反汇编的前提,需要根据硬件特征和程序...

    计算机常见问题解答大全-计算机原理常见问题大全.doc.pdf

    CPU必须能够区分读出的是指令还是数据。如果是指令,CPU会把指令的操作码送到指令译码器进行译码,而把指令的地址码送到相应的地区进行处理;如果是数据,则送到寄存器或运算器。 透明性 在计算机领域中,站在某一...

    MPU6050读出原始数据

    在“程序3 读出数据”这个文件中,你可能会看到如何使用正点原子的库函数来读取和解析这些原始数据。这些函数可能会包括发送I2C请求、处理响应以及将接收到的二进制数据转换为可读的物理值。为了验证读取的正确性,...

    松下PLC的编程指令手册

    - **RDS (Read Stack)**:堆栈读出指令,用于在子程序返回前恢复之前的状态。 - **POPS (Pop Stack)**:堆栈弹出指令,用于从堆栈中移除已保存的状态。 - **CALL (Call)**:子程序调用指令,用于调用预先定义的子...

    SPI数据读取

    ### SPI数据读取知识点 #### 一、SPI简介 SPI(Serial Peripheral Interface)是一种高速的全双工同步...此外,不同的硬件平台可能会有不同的GPIO控制方式,因此上述代码中的GPIO控制指令需要根据实际情况进行调整。

    监听串口,读出数据

    由于串口数据是异步到达的,所以通常需要在一个循环中不断检查缓冲区是否有新的数据。 4. **处理接收到的数据**:读取到的数据可能是一串连续的字节流,需要按照特定的协议或格式进行解析。描述中提到的“分割需要...

    51单片机将数据0xaa写入X5045再读出送P1口显示proteus源文件(含C源码)

    项目中,51单片机将数据0xAA写入X5045,然后读出这个数据。这一过程可能包括初始化SPI接口,发送写指令,传输数据,接收确认信号,再发送读指令,接收数据并进行校验。这涉及到对单片机寄存器的操作,如设置SPI时钟...

    VBA从excel读出数据写到word表格指定位置

    VBA从excel读出数据写到word表格指定位置

Global site tag (gtag.js) - Google Analytics