汇编学习笔记:CPU内部组成,寄存器讲解

==============CPU内部组成,寄存器讲解===========================
一个典型的CPU由控制器、运算器、寄存器等器件构成,这些器件通过【内部总线】相连!


运算器进行信息处理、
寄存器进行信息存储、
控制器控制各种器件进行工作。


8086CPU的寄存器都是16位的,可以存放两个字节。


字在寄存器中的存储:
字节 Byte:一个字节由8个Bit组成,可以存在8位寄存器中。
字 Word:一个字由两个字节组成,这两个字节分别称为这个字的高八位和低八位。
eg: 01101101   11000110
   -高位字节- -低位字节-




一个16位寄存器所能存储的数据最大值是多少?(这里求的是最大值,不是能存储的个数!)
解答:因为最小值是0,最大值是2^16-1=65535,可以表示的总数据有2^16=65536个(0-65535)
疑惑:16位寄存器不是能存储2byte数据吗?那这里怎么是65535呢?
解惑:一个16位寄存器可以存储一个16位二进制的数据,8位二进制是1个字节,16位也就是2个字节,但这16位二进制数可以表示很多不同的数值,
比如说0000000000000000和0000000000000001同样是16位,但表示的数值是不一样的!
那么怎么计算这个16位数据所能表示的最大值呢?根据这个公式就可以计算了:N位二进制数所能表示的最大数值为(2^N)-1


几条简单的汇编指令(汇编指令是控制CPU的):


汇编指令      控制CPU完成的操作      高级语言的描述方法
mov ax,18     将18送入寄存器ax        ax=18;
mov ah,78     将78送入寄存器ah        ah=18;
add ax,8      将ax寄存器的数值加上8   ax=ax+8;
mov ax,bx     将bx中的数据送入ax      ax=bx;
add ax,bx     将ax和bx中的数值相加,结果存在ax中      ax=ax+bx;
这里需要注意的是进行数据传送或运算时,要注意指令的两个操作对象的位数应当是一致的。


物理地址:
CPU要访问内存单元,就要给出内存单元的物理地址。
CPU通过地址总线送入存储器的必须是一个内存单元的物理地址,CPU在向地址总线发出物理地址之前,必须要在内部生成这个物理地址,不同的CPU有着不同的形成物理地址的方式,现在讨论一下8086CPU如何在内部形成内存单元物理地址的。


16位结构的CPU:
运算器一次可以最多处理16位的数据;
寄存器的最大宽度为16位;
寄存器与运算器之间的通路是16位的;


8086是16位结构的CPU,也就是说在8086内部能一次性处理、传输、暂时存储的信息长度是16位的。(注意这里讲的是CPU内部)
8086有20位地址总线,寻址能力是2^20=1MB,但是8086内部又是16位的,只能一次性处理、传输、暂时存储16位的信息长度,寻址能力只有64kb。
为了解决这个冲突,8086CPU采用一种在内部用两个16位地址合成的方法来形成一个20位的物理地址。
具体做法是:
地址加法器采用 物理地址=段地址x16+偏移地址 的方法合成物理地址;


段地址x16,其实就是数据左移4位(二进制位);
一个数据的二进制形式左移N位,相当于该数据乘以2的N次方;一个X进制的数据左移1位,相当于乘以X;


☆问题一:给定段地址0001H,仅通过变化偏移地址寻址,CPU的寻址范围为___到___;
解答:首先明白,物理地址=SAx16+EA,现在SA=0001H,EA的变化范围是0H~FFFFH,所以寻址范围为0001Hx16+0H(0010H) ~ 0001Hx16+FFFFH(1000FH);


☆问题二:数据放在内存20000H单元中,现给定段地址SA,若想用偏移地址寻到此单元,则SA应满足的条件是:最小为___,最大为___
已知:物理地址为20000H,16=0010H=10H,求SA的公式为:SA=(20000H-EA)/10H;
当EA取最大值时,SA可取最小值。即20000H - FFFFH = 10001H;
但10001H不是10H的倍数,所以,偏移地址只能取到FFF0H时才能是段地址x16的为10H的倍数;
所以求得SA=(20000H-FFF0H)/10H=1001H;
当EA取最小值时,SA可取最大值。即20000H - 0000H = 20000H / 10H = 2000H;
所以,SA应满足的条件是:最小为1001H,最大为2000H;


8086CPU提供4个【段寄存器】,CS、DS、SS、ES;段寄存器负责提供内存单元的地址。
CS(代码段寄存器)跟IP(指令指针寄存器)


在8086PC机中,任意时刻,设CS中的内容为M,IP中的内容为N,8086CPU将从内存 MX16+N 单元开始,读取一条指令并执行;
具体的工作流程请看书中插图。P26.


【小的分析总结】
编程!到底是在做什么???


计算机的基本组成:运算器,控制器,存储器,输入输出设备。
软件:就是计算机数据跟指令的集合!【必须明白】
CPU:解释计算机指令以及处理计算机软件中的数据。
进一步说明,编写程序,就是让CPU去执行我们写的一段实现某个功能的代码[数据跟指令]。


汇编语言是面向机器的程序设计语言。


存储器,被划分为若干个存储单元,每个存储单元能存储一个字节(byte),等于8位(bit)。
字节是计算机存储容量的基本单位。能存多大呢?
能存8bit,8bit能表示多少个数呢?2^8=256个数。00000000 - 11111111 FF




段寄存器与通用寄存器的区别:
段寄存器 - 一般用来存储地址信息,这些地址信息一般都指向一段代码
通用寄存器 - 一般用来存储临时数据


这仅仅是从编程角度看来,在内存角度看,没有任何区别,都是二进制数据
网友详细解答:
寄存器集成在cpu中,是cpu能够直接访问的存储设备吧。其容量极小,但是访问速度是最快的。
当cpu执行指令的时候,它根据代码寄存器和IP往内存中找到相关的机器码来执行指令,
代码段寄存器CS存放的是代码段的基址,ip存放的是偏移,它指向当前执行代码的偏移地址。当执行一条指令后,它会加一。
寄存器由于容量小,不可能存放什么变量什么的,它一般就存放一些地址作为索引,cpu执行指令的时候根据它的地址去内存找相关内容来完成当前的执行。包括变量的内容什么的。
至于通用寄存器ax之类,通常就用来暂存中间的结果,比如从内存取出的变量,先用一寄存器保存,然后执行指令,这样寄存器的内容会发生变化(指令是直接作用于寄存器对象的),
然后把它的内容可以传给内存保存下来。ax,bx,cx,dx在一般情况下可以通用,只是要注意它们的特殊用法,
比如在loop指令的时候默认的就是操作cx,还有bx是唯一能够当指针寄存器来用的通用寄存器,ax一般用于dos功能调用等等。其他场合你可以随便用哪个啊。


修改CS跟IP中的内容,可用“jmp 段地址:偏移地址”的指令完成,如:
jmp 2AE3:3,执行后,CS=2AE3H,IP=0003H,CPU将从2AE33处读取指令。
若只想修改IP中的内容,可用“jmp 某一合法寄存器”的指令完成,如:
jmp ax,执行指令前:ax=1000H,CS=2000H,IP=0003H;
        执行指令后:ax=1000H,CS=2000H,IP=1000H;
“jmp 某一合法寄存器”指令完成的功能是:用寄存器中的值修改IP;


检测点:下面的3条指令执行后,CPU几次修改IP?都是在什么时候?最后IP中的值是多少? 
mov ax,bx 
sub ax,ax 
jmp ax 


解答:
读入mov ax,bx指令到指令缓冲器 IP进行第一次修改 执行mov ax,bx   
读入sub ax,ax指令到指令缓冲器 IP进行第二次修改 执行sub ax,ax   
读取jmp ax   指令到指令缓冲器 IP进行第三次修改 执行jmp ax   IP进行第四次修改


Debug调试指令:
R命令查看、修改CPU寄存器中的内容;
  查看-R,修改-R[寄存器代号]
D命令查看内存中的内容;
  查看-D,查看具体地址中的信息-D 段地址:偏移地址,查看一个范围-D 段地址:偏移地址 结尾偏移地址
E命令修改内存中的内容;
  批量修改-E 起始地址 数据 数据 数据 数据 数据 数据 数据 数据
  单个修改-E 起始地址 [回车]
  写入字符串-E 1000:0 1 'a' 2 'b' 3 'c' 4 'd' 5 'e'
U命令将内存中的机器指令翻译成汇编指令;
  -U 1000:0
T命令执行一条机器指令;


A命令以汇编指令的格式在内存中写入一条机器指令;

posted @ 2013-01-07 06:20  java程序员填空  阅读(1007)  评论(0编辑  收藏  举报