- 浏览: 75520 次
- 性别:
- 来自: 北京
原文地址: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里读指令。
发表评论
-
排序算法---计数排序
2011-11-27 14:57 611#include <stdio.h> vo ... -
排序算法---归并排序
2011-11-26 19:33 748#include <stdio.h> vo ... -
排序算法---交换排序(冒泡排序、快速排序)
2011-11-26 19:32 702#include <stdio.h> vo ... -
排序算法---选择排序(简单插入排序、堆排序)
2011-11-26 19:31 649#include <stdio.h> vo ... -
排序算法---插入排序(简单排序、shell排序)
2011-11-26 19:29 650#include <stdio.h> vo ... -
删除字符串中的特定字符和重复字符
2011-11-26 13:45 666#include <stdio.h> vo ... -
Linux编程-多线程、同步和互斥(转载)
2011-11-14 15:27 1209http://www.cnblogs.com/skynet/a ... -
寻找字符串中的最大数字子串
2011-09-22 17:17 1523#include <stdio.h> int f ... -
删除子字符串
2011-09-21 15:27 604#include <stdio.h> #incl ... -
c语言随机数
2011-09-18 17:15 687#include <stdio.h> #i ... -
带头结点有序单链表的合并
2011-09-08 14:21 1186typedef int Item; typedef s ... -
链表逆序的递归/非递归算法
2011-09-01 23:37 1414/** *链表逆序的递归/非递归算法 */ # ... -
递归算法---字符串---全/部分组合和全排列
2011-08-30 23:01 1222#include <stdio.h> #i ... -
递归算法---0-1背包问题(面试宝典)
2011-08-28 21:11 1903/** *正整数n,m,从数列1、2、3、...、n中随 ... -
递归算法---字符串全组合(面试宝典)
2011-08-28 17:24 1257/** *求一字符串所有字串的组合 */ #i ... -
递归算法---求解多元一次方程
2011-08-28 10:38 1898/** * 求解x1+x2+x3+...+x10 = ... -
(zz)关于类的sizeof
2011-08-27 18:16 589http://blog.sina.com.cn/s/blog_ ... -
(zz)结构体字节对齐原则
2011-08-27 17:53 1579结构体默认的字节对齐一般满足三个准则: 结构体变量的首 ... -
list.h from linux-2.4
2011-08-25 09:59 607#ifndef _LIST_H_ #define _L ... -
The C Programming Lang (K&R) hash table
2011-08-25 09:52 936hash.h #include <stdio.h ...
相关推荐
在本实验中,学生将设计并实现一个基于R-I型指令的CPU。R-I型指令是一种常见的计算机指令格式...学生需要编写Verilog代码来实现这些功能,并通过仿真工具验证其正确性,确保CPU能够正确地执行R-I型指令集中的各种操作。
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...
标题中的“将数据0xaa写入X5045再读出送P1口显示”是一个典型的单片机编程任务,涉及到几个关键知识点,包括单片机基础、内存芯片X5045的操作以及端口I/O操作。下面将详细阐述这些概念。 1. **单片机**:单片机,也...
在指令和数据取到 CPU 之前,它们都存放在存储器中,CPU 必须能够区分读出的是指令还是数据,如果是指令,CPU 会把指令的操作码送到指令译码器进行译码,而把指令的地址码送到相应的地方进行处理;如果是数据,则送...
- 数据总线(DBUS)在CPU和存储器之间传输数据,如指令和运算结果。在这个实验中,数据总线上的位数是8位,从D7到D0。 5. **地址总线**: - 地址总线(A Bus)用来指定存储单元的位置,如AR7到AR0指示了地址寄存器的...
Basys3板提供了四个七段数码显示器来显示关键的CPU信息,包括当前指令地址PC、下条指令地址PC、RS寄存器地址及数据、RT寄存器地址及数据以及ALU的结果输出。以下是对这些知识点的详细解释: 1. **当前指令地址PC...
2. **读取当前时间**:使用时钟读出指令(CR)读取PLC内部时钟的当前时间,并将其存储到指定的数据寄存器中。 ```plaintext CR D1002 D1003 ``` 其中,D1002用于存放年份,D1003用于存放其他时间信息。 3....
在计算机体系结构中,CPU(中央处理器)是执行指令并处理数据的核心部件。"CPU-hazard"是指在CPU执行指令时遇到的一些潜在问题,这些问题可能导致性能下降、数据错误或者指令执行顺序混乱。这些危害通常分为三类:...
“51汇编集成开发环境”中集成有一个反汇编工具,该工具目前不支持对非0地址开始的部分代码进行反汇编,因为非0地址开始的部分代码无法区分程序和数据。 正确获取目标代码是反汇编的前提,需要根据硬件特征和程序...
CPU必须能够区分读出的是指令还是数据。如果是指令,CPU会把指令的操作码送到指令译码器进行译码,而把指令的地址码送到相应的地区进行处理;如果是数据,则送到寄存器或运算器。 透明性 在计算机领域中,站在某一...
在“程序3 读出数据”这个文件中,你可能会看到如何使用正点原子的库函数来读取和解析这些原始数据。这些函数可能会包括发送I2C请求、处理响应以及将接收到的二进制数据转换为可读的物理值。为了验证读取的正确性,...
- **RDS (Read Stack)**:堆栈读出指令,用于在子程序返回前恢复之前的状态。 - **POPS (Pop Stack)**:堆栈弹出指令,用于从堆栈中移除已保存的状态。 - **CALL (Call)**:子程序调用指令,用于调用预先定义的子...
### SPI数据读取知识点 #### 一、SPI简介 SPI(Serial Peripheral Interface)是一种高速的全双工同步...此外,不同的硬件平台可能会有不同的GPIO控制方式,因此上述代码中的GPIO控制指令需要根据实际情况进行调整。
由于串口数据是异步到达的,所以通常需要在一个循环中不断检查缓冲区是否有新的数据。 4. **处理接收到的数据**:读取到的数据可能是一串连续的字节流,需要按照特定的协议或格式进行解析。描述中提到的“分割需要...
项目中,51单片机将数据0xAA写入X5045,然后读出这个数据。这一过程可能包括初始化SPI接口,发送写指令,传输数据,接收确认信号,再发送读指令,接收数据并进行校验。这涉及到对单片机寄存器的操作,如设置SPI时钟...
VBA从excel读出数据写到word表格指定位置