第二章 寄存器
一个典型的CPU由运算器,控制器,寄存器(CPU工作原理)等器件构成,这些器件靠内部总线相连.前一章所说的总线,相对于CPU内部来说是外部总线.内部中心实现CPU内部各个器件之间的联系,外部总线实现CPU和主板上其他器件的联系.简单地说,在CPU中:

  • 运算器进行信息处理;
  • 寄存器进行信息存储;
  • 控制器控制各种器件进行工作;
  • 内部总线连接着各种器件,在他们之间进行数据的传送.

不同的CPU,寄存器的个数,结构是不同的.

2.1 通用寄存器

8086CPU的所有寄存器都是16位的,可以存放两个字节.AX,BX,CX,DX这4个寄存器通常用来存放一般性的数据,被称为通用寄存器.

2.2 字在寄存器中的存储

出于对兼容性的考虑,8086CPU可以一次性处理一下两种尺寸的数据.

  • 字节:记为byte,一个字节由8个bit组成,可以存在8位寄存器中
  • 字:记为word,一个字由两个字节组成,这两个字节可以分别称为这个字的高位和低位字节

2.12 代码段

前面说过,对于8086PC机,在编程时,可以根据需要,将一组内存单元定义为一个段.我们可以将长度为N(N<=64KB)的一组代码,存在一组地址连续,起始地址为16的倍数的内存单元,我们可以认为,这段内粗呢是用来存放代码的,从而定义了一个代码段.比如,将:

mov ax,0000 (B8 00 00)
add ax,0123H(05 23 01)
mov bx,ax   (8B D8)
jmp bx      (FF E3)

这段长度为10个字节的指令,存放在123B0H123B9H的一组内存单元中,我们就可以认为123B0H123B9H这段内存是用来存放代码的,是一个代码段,它的段地址为123BH,长度为10个字节.

如何使得代码段中的指令被执行呢?将一段内存当做代码段,仅仅是我们在编程时的一种安排CPU并不会由于这种安排,就自动地将我们定义的代码段中的指令当做指令来执行.CPU只认被CS:IP指向的内存单元中的内存为指令.所以,要让CPU执行我们放在代码段的指令,必须要将C
S:IP指向所定义的代码段中的第一条指令的首地址.

3.3 字的传送

前面我们用mov指令在寄存器和内存之间进行字节类型数据的传送.因为8086CPU是16位结构,有16根数据线,所以,可以一次性传送16位的数据,也就是说可以一次性传送一个字.只要在mov指令中给出16位的寄存器就可以进行16位数据的传送了;

3.4 mov,add,sub指令

前面我们用到了mov,add,sub指令,他们都带有两个操作对象
到现在我们知道,mov指令可以有以下几种形式

mov 寄存器,数据
mov 寄存器,寄存器
mov 寄存器,内存单元
mov 内存单元,寄存器
mov 段寄存器,寄存器

3.5 数据段

前面讲过,对于8086PC机,在编程时,可以根据需要,将一组内存单元定义为一个段.我们可以讲一组长度为N(N<=64KB),地址连续,其实地址为16的倍数的内存单元当做专门储存数据的内存空间,从而定义了一个数据段.比如用123B0H123B9H这段内存空间来存放数据,我们就可以认为,1231B0H123B9H这段内存是一个数据段,它的段地址是123BH,长度为10个字节.

如何访问数据段中的数据呢?将一段内存当做数据段,是我们在编程时的一种安排,可以在具体操作的时候,用ds存放数据段的段地址,再根据需要,勇相关指令访问数据段中的具体单元.

3.6 栈

在这里,我们对于栈的研究仅限于这个角度:展示一种具有特殊的访问方式的存储空间.它的特殊性就在于,最后进入这个空间的数据,最先出去.

3.7 CPU提供的栈机制

现今的CPU都有栈的设计,8086CPU也不例外.8086CPU提供相关的指令来以栈的方式访问内存空间.这意味着,再给予8086CPU编程的时候,可以将一段内存当做栈来使用.

8086CPU提供入栈和出栈指令,最基本的两个是PUSH(入栈)和POP(出栈).比如,push ax表示将寄存器ax中的数据送入栈中,pop ax表示从栈顶取出数据送入ax.8086CPU的入栈和出栈操作都是以字为单位进行的.

其一,我们将10000H1000FH这段内存当做栈来使用,CPU执行push和pop指令时,将对这段空间按照栈的后进先出的规则进行访问.但是一个重要的问题是,CPU如何知道10000H1000FH这段空间被当做栈来使用?

其二,push ax等入栈指令执行时,要将寄存器中的内容放入当前栈顶单元的上方,成为新的栈顶元素;pop ax等指令执行时,要从栈顶单元取出数据,进入寄存器.显然,push,pop在执行的时候,必须知道哪个单元是栈顶单元,可以,如何知道?

这不禁让我们想起另外一个讨论过的问题,就是CPU如何知道当前要执行的指令所在的位置?我们现在知道答案,那就是CS,IP中存放着当前指令的段地址和偏移地址.现在的问题是:CPU如何知道栈顶的位置?显然,也应该有相应的的段寄存器来存放栈顶的地址,8086CPU中,有两个寄存器,段寄存器SS和寄存器SP,栈顶的段地址存放在SS中,偏移地址存放在SP中.任意时刻,SS:SP指向栈顶元素.push指令和pop指令执行时,CPU从SS和SP中的得到栈顶的地址.

3.8 栈顶超界的问题

栈顶超界问题是危险的,因为我们既然将一段空间安排为栈,那么在栈空间之外的空间里很可能存放了具有其他用途的数据,代码等,这些数据,代码可能是我们自己程序中的,也可能是别的程序中的(毕竟一个计算机系统中并不是只有我们自己的程序在运行).但是由于我们在入栈和出栈时的不小心,而将这些数据,代码意外地改写,将会引发一连串的错误.

8086CPU不保证我们对栈的操作不会超界.这样就是说,8086CPU只知道栈顶在何处(由SS:SP指示),而不知道我们安排的栈空间有多大.这点就好像CPU只知道当前要执行的执行在何处(由CS:IP指示),而不知道要执行的指令有多少.

我们在编程的时候要自己操作栈顶超界的问题,要根据可能用到的最大栈空间,来安排栈的大小,防止入栈的数据太多而导致的超界;执行出栈操作的时候也要注意,以防栈空的时候继续出栈而导致的超界.

开发日记-20190914 关键词 汇编语言王爽版 第二章相关推荐

  1. 开发日记-20190914 关键词 汇编语言王爽版 第四章

    第四章 第一个程序 4.1 一个源程序从写出到执行的过程 第一步:编写汇编源程序 使用文本编辑器,用汇编语言编写汇编源程序 这一步工作的结果是产生一个储存源程序的文本文件. 第二步:对源程序进行编译程 ...

  2. 开发日记-20190914 关键词 汇编语言王爽版 第七章第八章

    第七章 更灵活的定位内存地址的方法 7.1 and和or指令 (1)and指令:逻辑与指令,按位进行与运算 (2)or指令:逻辑或指令,按位进行或运算 7.2 关于ASCII码 一个文本编辑过程中,就 ...

  3. 开发日记-20190914 关键词 汇编语言王爽版 第六章

    第六章 包含多个段的程序 前面的程序中,只有一个代码段.现在有一个问题是,如果程序需要用其他空间来存放数据,使用哪里呢?在第五章中,我们说0:200~0:2FF是相对安全的,可这段空间的容量只有256 ...

  4. 开发日记-20190914 关键词 汇编语言王爽版 第五章

    第五章 [BX]和loop指令 5.2 Loop指令 loop指令的格式是:loop标号,CPU执行loop指令的时候,要进行两步操作, (cx)=(cx)-1 判断cx中的值,不为零则转至标号处执行 ...

  5. 开发日记-20190914 关键词 汇编语言王爽版 第三章

    第三章 寄存器(内存访问) 3.1 内存中字的存储 CPU中,用16位寄存器来存储一个字.高8位存放高位字节,低八位存放低位字节.在内存存储时,由于内存单元是字节单元(一个单元存放一个字节),则一个字 ...

  6. 开发日记-20190915 关键词 汇编语言王爽版 第九章

    第九章 转移指令的原理 可以修改IP或同事修改CS和IP和指令统称为转移指令.概括地讲,转移指令就是可以控制CPU执行内存中某处代码的指令. 8086CPU的转移行为有以下几类: 只修改IP时,称为段 ...

  7. 开发日记-20190913 关键词 汇编语言王爽版 第一章

    Preface 最近手机坏了,感觉心里挺不是滋味的,在各种方面,特别是钱!直到今天,我才知道钱真的是一种很重要的东西,以及苹果公司到底有多恶心. 真的很奇怪,为什么世界上就没有任何一家公司能和苹果公司 ...

  8. 开发日记-20190915 关键词 汇编语言王爽版 第十一章

    第十一章 标志寄存器 CPU内部的寄存器中,有一种特殊的寄存器(对于不同的处理器,个数和结构都可能不同)具有以下三种作用. (1)用来存储相关的指令的某些执行结果 (2)用来为CPU执行相关的指令提供 ...

  9. 开发日记-20190915 关键词 汇编语言王爽版 第十章

    第十章 CALL和RET指令 call 和ret指令都是转移指令,他们都修改IP,或同时修改CS和IP.他们经常被共同用来实现子程序的设计. 10.1 ret和retf ret指令用栈中的数据,修改I ...

最新文章

  1. 学校计算机机房好处,浅谈学校计算机机房维护
  2. Netflix是这样炼成的:谁构建,谁运维
  3. python小知识点
  4. Springboot之多环境打包配置
  5. SET QUERY_GOVERNOR_COST_LIMIT
  6. AngularJS中页面传参方法
  7. Linux的sys接口和proc接口创建
  8. [OpenCV学习]1、环境搭建
  9. java 二维数组内存溢出_程序员:学习心得,Java内存区域,内存溢出异常
  10. angularjs实际工程目录结构
  11. Iphone获取本地ip地址
  12. filenet安装前置工作-总结安装一天的成果
  13. 如何使用Python生成二维码
  14. LabVIEW 编程小技巧
  15. vue 高德api Map事件方法封装
  16. C语言作业然后是几点,用C语言解“然后是几点”问题
  17. 什么游戏蓝牙耳机好用?性价比高的游戏蓝牙耳机推荐
  18. MySQL Error:1677
  19. PDF怎么合并?教你2个免费一键合并PDF的方法
  20. 人工智能第2章 智能 Agent

热门文章

  1. 把数据转换为在内存中Tree(树形结构)。_Linux的中断处理机制 [二] - 数据结构(2)...
  2. cassandra hbase_为什么选择Cassandra
  3. 计算机主键盘的布局,计算机键盘的布局,结构和布置
  4. java 方法特点是什么_Java String 的特点是什么?它有哪些重要的方法?
  5. java 关闭按钮监听_Java事件处理(1)——实现简单的事件监听功能
  6. 未定义与 double 类型的输入参数相对应的函数 eval_点评一下鸿蒙os的时钟计算函数...
  7. php error 关闭,php error_reporting()关闭报错
  8. mysql中in的用法总结_MySQL中的find_in_set()函数使用技巧心得与应用场景总结
  9. php session不生效_php 验证session无效问题解决办法
  10. linux 脚本select菜单,Shell:如何写一个多选菜单的脚本