汇编之路 (二) 寄存器(CPU工作原理)

CPU概述

    一个CPU由运算器、控制器、寄存器、等器件组成,这些靠内部总线相连

                区别:内部总线实现cpu内部各个器件之间的联系

                          外部总线实现cpu 与 主板 上其它器件的练习    鼠标,主板,

寄存器概述

        8086cpu 有 14 个 寄存器名称为,AX、BX、CX、DX、SI、DI、SP、BP、IP、CS、SS、DS、ES、PSW

        八个通用寄存器

        

2.1通用寄存器

       

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

        AX、BX、CX、DX通常用来存放一般性数据,被称为通用寄存器。

ax为例,看一下寄存器的逻辑结构

从0开始 ,从右向左              eax    32 位       rax    64位            编号 低到高  1-15

一个16位寄存器可以存放一个16位的数据

        数据:18

        二进制表示:10010

        数据:20000

         二进制表示:0100111000100000

        一个16位寄存器,能存储的数据最大值为多少

                2的16次方, 10个数   0-9    2^16-1                 

8086上一代cpu中的寄存器都是8位的

                保证兼容,这四个寄存器,可以分为两个独立的8位寄存器, 16 划分成两个8位

                AX可以分为 AH  和   AL             H高  、 L低         寄存器分高低,人分贵贱

                BX可以分为 BH 和BL

                CX可以分为 CH 和 CL

                DX 可以分为  DH 和DL      

        8086CPU的8位寄存器存储逻辑

                16位寄存器,分为两个8位寄存器,图解

        AX的低8位 (0位~7位) 构成了AL寄存器。       高8位(8位~15位)构成了AH寄存器

AH和AL 寄存器是可以独立使用8位寄存器            不能独立,就不能兼容之前的8位版本了

         8086CPU的8位寄存器数据存储情况

 一个8位寄存器所存储的数据最大值是?        2^8 -1          2的八次方-1

2.2 字在寄存器中的存储

        一个字可以存在一个16位寄存器中,这个字的高位字节和低位字节自然就存在这个寄存器的高8位寄存器和低8位寄存器中。             

          1个字 == 16位   ==    两个字节 2Byte

        数制       进制转化

        高转低,  

        低转高

        16进制 一位 相当于 二进制的4位,如 0100111000100000 可表示4(0100)、E(1110)、2(0010) 、0(0000) 四位16进制数

        16进制H    二进制 B            十进制D啥也不加       八进制 0

2.3几条的汇编指令

        

 mov ax,18   将18放到ax 中      ax=18

mov ah,78        将78放到AH        ah=78

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 执行每条指令后,对寄存器中的数据进行改变

        

        8226  + 8226   = 1044C       存放4位,  044C        再多存放不了了   ,  1存放哪里了,进制位里?

        

AH |  AL    这里算的是 al 溢出后,不会补到AH里的,   如果是AX  是可以的

            这里的丢失,指的是进制不能在8位寄存器中保存,但是CPU不是真的丢弃  ,

最多用四条指令 ,计算2 的4次方

             mov ax,2     add ax,2  add ax,4   add ax,8

             mov ax,16                mov ax,8   add ax,8

2.4 物理地址

        CPU访问内存单元时要给出内存单元的地址。所有的内存单元构成的存储空间是一个一维的线性空间。

        这个唯一的地址,称为物理地址;

     显卡,等  都有rom 自己的空间,从cpu上看,他们都是逻辑上的 线性空间

2.5 16位结构的CPU

        懂了16位,就会64位了

        16位结构描述了以恶cpu具有一下几个方面

        1.运算器一次最多可以处理,16位的数据。

        2.寄存器的最大宽度为16位。

        3.寄存器和运算器之间的通路是16位的

2.6 8086 CPU给出物理地址的方法

        x86    8086   

        8086 有20位地址总线 , 可传输20位地址,寻址能力位1M        2^20 = 1MB

        

        8086内部为16位结构,只能传输16位的地址,表现的寻址能力却只有64k        2^16 = 64k

         2的16次方:65536 B                Byte  字节                8bit(比特) == 1 Byte 字节

                

 8086CPU采用一种在内部用两个16位地址合成的方法来形成一个20位的物理地址~

将两个16位地址,变成20位地址         

地址加法器,怎么工作的?   地址加法器合成物理地址的方法

                物理地址 = 段地址 * 16 + 偏移地址

* 16   相当于 向左移一位 ,     1个16进制数, 代表 四个 2进制的位,  这里5个 4*5 =20 刚好

        

        段地址 * 16  的问题,

        段地址 * 16 ,另一种说法,        数据左移4位  (二进制位)

        

1一个数据的二进制形式左移1位,相当于该数据乘以2   如果是16进制,就乘16

2一个数据的二进制形式左移N位,相当于改数据乘以2的N次方

2.7段地址 * 16 + 偏移地址 = 物理地址 的本质含义

        说明“基础地址+偏移地址 = 物理地址的思想 : 第一个比喻

                

 2000是基地址,         826是基地址的偏移地址

2826 =    200*10 + 826

cpu 给 地址加法器,   第一个位数据,称为段地址,会默认的*16,让他左移4位

+第二位给的偏移地址 得到 物理地址   然后输出

2.8段的概念

        错误认识 :

                内存被划分成了一个一个的段,每一个段有一个段地址。
        其实:

                内存并没有分段,段的划分来自于CPU,由8086cpu用 ( 段地址 * 16) +偏移地址=物理地址 的方式给出内存单元的物理地址,使得我们可以用分段的方式来管理内存。

        

以后,在编程时可以根据需要,将若干地址连续的内存单元看作一个段,用段地址X16定位段的起始地址(基础地址),用偏移地址定位段中的内存单元

 (I) 段地址X16 必然是 16的倍数,所以一个段的起始地址也一定是16的倍数;

(2) 偏移地址为16位,16 位地址的寻址能力为 64K,所以一个段的长度最大为64K

                         4个的2进制    表示   16进制                2^16 = 64KB

内存单元地址小结

        CPU访问内存单元时,必须向内存提供内存单元的物理地址。        

                看上一个妹妹,要先问地址 ,寄情书,,不然寄到哪?
        8086CPU在内部用段地址和偏移地址移位相加的方法形成最终的物理地址。

                                        段地址 * 16 + 偏移地址 = 物理地址

思考:

(1)

都指向一个物理地址  ,一个固定的地址,可以有很多条路通向

(2) 如果给定一个段地址,仅通过变化偏移地址来进行寻址,最多可以定位多少内存单元了

                无论是段地址, 还是 偏移地址 都是 16位,2的16位可以定位多少个内存单元

结论:

           偏移地址16位,变化范围为O~FFFFH,仅用偏移地址来寻址最多可寻64K个内存单元

                   2^16 -1 =65535                0000 - ffff

        可根据需要,将地址连续、起始地址为16倍数的一组内存单元定义为一个段

比如: 给定段地址1000H,用偏移地址寻址,CPU的寻址范围为:10000H~IFFFFH。

                10000H *16     = 1FFFFH 

小小结

存储单元地址用两个元素来描述, 即 段地址和偏移地址

数据在21F60H内存单元中。'对于8086PC机的两种描述 :
        (a) 数据存在内存2000:1F60单元中 ;
        (b) 数据存在内存的2000段中的1F60H单元中

可根据需要,将地址连续、起始地址为16的倍数的一组内存单元定义为一个段。

检测2.2

        

+上FFFF   16位

 sa最小1001H   最大为2000H

2.9段寄存器

        段寄存器就是提供段地址的

                8086CPU 有4个段寄存器:                现在不止4个,八个?

                        CS、DS、SS、ES

                   代码段   数据段      堆栈段     附加段什么都有

        当8086CPU要访问内存时,由这4个段寄存器提供内存单元段地址

2.10 CS和IP 寄存器

        CS和IP是8086CPU中最关键的寄存器,

        它们指示了CPU当前要读取指令的地址

       CS为代码  段寄存器,

       IP为指令指针 寄存器,

        内存 mov ax  是b8     取三个地址

(1) 从CS:IP指向内存单元读取指令,读取的指令进入指令缓冲器 ; 

(2) IP = IIP + 所读取指的长度,从而指向下一条指令 ;

(3) 执行指令。 转到步骤 (1),重复这个过程。

FFFF0H 执行的第一条指令,  木马,病毒 怎么样不被查杀,在杀毒软件运行前,先把杀毒软件灭口了。

改变CS IP的值去指向  木马或病毒   ,内部程序再去把查毒软件屏蔽掉,

放在内存的地址,在  杀毒软件的前面     ,CPU先加载我的程序,

        在任何时候,CPU将CS、IP 中的内容当作指令的段地址和偏移地址,用它们合成指令的物理地址,到内存中读取指令码,执行。

如果说,内存中的一段信息曾被CPU执行过的话,那么,它所在的内存单元必然被CS:IP指向过。

        植物大战僵尸    cs: ip 

2.11修改CS 和 IP 的指令

在CPU中,程序员能够用指令读写的部件只有寄存器程序员可以通过改变寄存器中的内容实现对CPU的控制

        CPU从何处执行指令?

                是由cs、ip中的内容决定的,

        程序员可以通过改变CS、IP中的内容来控制CPU执行目标指令。

如何改变CS、IP 的值?

        之前是如何修改ax的值?

         mov ax,123

        mov指令可以改8086CPU 大部分寄存器的值 , 被称为传送指令

能通过mov指令 ,能改变CS:IP 的值吗??

        不能,mov

        8086CPU为CS、P提供了另外的指令会来改变它们的值 : 转移指令jmp

        同时修改CS:IP的内容

                jmp 段地址:偏移地址

        jmp 2AE3:3        告诉 cpu 你现在应该去  2AE33 的物理地址

        jmp 3:0B16     3是 0003的意思,    前面是段地址*16 + 偏移地址 = 物理地址

                        0030+0B16 =0B46H

        功能 : 用指令中给出的段地址修改CS偏移地址修改IP。   

仅修改IP的内容       

                cs:ip

        jmp  某一合法寄存器     寄存器??ax、 bx                 

        jmp ax(类似于mov IP,ax)        mov ax,200H    == jmp ax    ==jmp 200H

        jmp bx

                功能: 用寄存器中的值修改IP。

2.12  代码段

8086 PC    可以 将一组内存单元 定义为 一个段

一个偏移地址不能超过16位,  也就是一个段索引长度 2^16次方,=64kb

所以一个段,最大放 64kb        (放不下,放到下一个段)

        放在内存单元中    内存单元是计算机存储数据的最小单位,以字节计数

10个字节      两个16进制   可以表示 1个字节

存在从123B0H~12339H的一组内存单元中,我们就可以认为,12330H~12339H这段内存单元是用来存放代码的,是一个代码段 ,它的段地址为123B0H,长度为10字节。

如何使代码段 中的指令 被执行呢?

        CPU 只认 被 CS:IP 指向的内存单元中的内容为指令

        

2.9~2.12  的小结

      1.段地址在8086CPU的寄存器中存放。当8086CPU要访问内存时,由段寄存器提供内存单元的段地址。8086CPU有4个段寄存器,其中CS用来存放指令的段地址

       2.CS 存放指令的段地址,IP存放指令的偏移地址

        8086PC  时刻将CPU将CS:IP指向的内容,当作指令执行

        3、8086CPU的工作过程 :

                (I) 从CS:IP指向内存单元读取指令,读取的指令进入指令缓冲器 ;

                (2) P指向下一条指令    这条指令,占了3个字节,IP会自动加上3,指向下一个指令

                                        ip = ip + 长度

                (3) 执行指令。(转到步骤 (1),重复这个过程。)

        4、8086CPU 提供 转义指令     修改 CS、IP 的内容       

                        jmp ax  是 改ip,偏移地址,   jmp 段地址:偏移地址  指向的是内容执行

检测点

       sub 是减法指令, add 相反

4次         mov  一次        sub 一次     jmp 一次             jmp执行完了,IP还要加

IP最后值为  0

实验一  查看CPU和内存,用机器指令,和汇编指令编程

debug 工具,本身是调试工具,也可以用来写程序

进入debug

R        命令查看,改变CPU 寄存器的内容

r ax  1111

D命令查看内存中的内容

E 命令改写内存中的内容 ; 机器指令?

010101111101  这样的?        e是之间往内存写数据

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

U 命令将内存中的机器指会翻译成汇编指令

T命令执行一条机器指令

可用 E 命令和 A 命令以两种方式将指令写入内存。注意用 T 命令执行时CS:IP 的指向。

建议还是用a  写指令,

   e是之间往内存写数据

16进制  转  十进制   然后看ASCII 码

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值