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 码