066-Assembly汇编03


1.CPU概述
CPU组成: 运算器,控制器,寄存器

内部总线连接CPU内部各个器件
外部总线连接CPU与主板上的各个器件


2.寄存器
8086CPU是16位的处理器
8088CPU是8位的处理器
现在的CPU都是64位的了
比如酷睿系列,移动的骁龙系列

早在1991年就有了第一个64位处理器,1993年就开始广泛使用了,所以到现在已经基本没有64位以下的处理器了

那么从1993年到现在,为什么没有使用128位的处理器呢,因为64位处理器一次能够处理2的64次方的数据的指令,数据宽度为64位,对现在的硬件条件来说已经非常够用了,想要突破2的64次方还有很长的路要走


3.14个寄存器
8086CPU有14个寄存器
AX,BX,CX,DX,
SI,DI
SP,BP,IP
CS,SS,DS,ES
PSW

4.8086CPU所有的寄存器都是16位的
可以存放2个字节
AX,BX,CX,DX这4个寄存器通常用来存放一般性数据,
所以叫 通用寄存器

5.然后我们来看下通用寄存器的逻辑结构
AX,16位,那么就是0到15,,一共16个位置
比如要放一个数据,18
2进制是 10010
那么存在AX里面就是
0000 0000 0001 0010

所以一般性数据就是像这样以二进制形式存在通用寄存器里面


6.16位AX存最大
存的最大的数据,那么就是
1111 1111 1111 1111
就是 2^16-1
那么就是 65536 - 1
是 65535


7.8086与8088
8088是8位的,8086是16位的
8086为了兼容老的8位的处理器,就把自己的寄存器分为2个独立的8位寄存器
也就是AX,BX,CX,DX这4个每个都可以分为2个独立的8位寄存器
AH,AL
BH,BL
H的意思是high,高位
L的意思是low,低位

所以兼容的时候就只用AL,BL,CL,DL
高位的寄存器全部填0


8.字在寄存器中的存储
一个字是2个字节,也就是16位

9.物理地址
CPU访问内存单元的时候要给出内存单元的地址,所有的内存单元构成的存储空间是一个一维的线性空间
这个唯一的地址称为物理地址


10.16位CPU
1.运算器一次最多处理16位的数据
2.寄存器宽度为16位
3.寄存器和运算器之间的通路是16位


11.8086
8086有20位的外部地址总线,可以传送20位的地址,寻址能力为2的20次方,也就是超过1024*1024Bit,那么就是1MB

8086内部为16位结构,只能传送16位的地址,那么寻址能力只有2的16次方,
也就是64*1024位,就是64KB


12.8086给出物理地址
8086采用在内部用2个16位地址的方法来形成一个20位物理地址

给出一个16位的段地址
给出一个16位的偏移地址
然后通过地址加法器
形成一个20位的物理地址
然后就可以跟内存进行沟通了


13.地址加法器
算法是这样
物理地址=段地址*16+偏移地址

例如
8086要访问地址为 123C8H的内存单元
首先,123C8,这是一个20位的地址
这个地址是这样计算出来的

1230H * 16 + 00C8H
计算可得 123C8H

那么其实*16,就是向左移1位
所以其实就是4位16进制在右边加1位就行了

14.段的概念
内存并没有分段,段的划分来自于CPU,由于8086给出了物理地址,所以用分段的方式来管理内存


15.内存单元
8位是1个内存单元,也就是1个字节,所以每次CPU访问内存,就根据物理地址找到这个内存单元
那么16位CPU寻址能力为2^16 64K
那么64位CPU寻址能力为2^64
16*1024*1024*1024*1024*1024*1024
16*1024*1024TB
16*1024PB(PetaByte 拍字节)
16EB(ExaByte 艾字节)
内存达到16EB才是64位CPU的极限


16.段地址
1.一个段的起始地址肯定是16的倍数
2.偏移地址是16位,16位地址的寻址能力是64K,所以一个段的长度最大为64K


17.内存单元
CPU访问内存单元时,必须向内存提供内存单元的物理地址
8086在内部用段地址和偏移地址移位相加形成最终的物理地址


18.物理地址
数据在21F60H内存单元中,可以这么说
1.在2000:1F60单元中
2.在2000段的1F60H单元中


19.段寄存器
之前学了通用寄存器,AX,BX,CX,DX
现在学段寄存器,也是4个
CS,DS,SS,ES
当8086要访问内存的时候,就由这4个段寄存器来提供内存单元的段地址


20.CS和IP
CS和IP是8086中最关键的寄存器,指示了CPU当前要读取指令的地址
CS是code segment           代码段寄存器
IP是instruction pointer  指令指针寄存器

21.8086工作过程
8086CPU启动或者复位之后,CS和IP被设置为CS=FFFFH,  IP=0000H
所以,刚启动的时候
CPU从内存FFFF0H单元中读取指令
所以
FFFF0H单元中的指令就是8086开机后执行的第一条指令


22.CS,IP
在任何时候,CPU将CS和IP中的内容当做指令的段地址和偏移地址,然后移位相加得到物理地址,然后读取指令,执行

如果说某一段信息曾经被CPU执行过,那么它所在的内存单元肯定被CS:IP指向过

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


24.只修改IP的内容
jmp ax
jmp bx
这就类似于
mov IP,ax
mov IP,bx
这就是利用通用寄存器中的值来修改IP

25.代码段CS
对于8086,可以根据需要将一组内存单元定义为一个段
可以将长度为N的一组代码,存在一组地址连续,初始地址为16的倍数的内存单元中,这段内存是用来存放代码的,从而定义了一个代码段

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

26.字的存储
比如我们要在0地址处存放20000,也就是4E20H,那么,
0 20H
1 4EH
0号单元存20H,  1号单元存4EH,
之前说过了,一个单元8位,4位可以存一个16进制数,所以一个单元存2位的16进制
所以0号单元存20H,
1号单元存4EH

0单元存放的是8位,也就是1个字节,是20
0010 0000

1单元存放的是4E
0100 1110


27.字型数据
字型数据2个单元,所以是4E20H,也就是20000.


28.DS段地址寄存器
data segment数据段地址,存放要访问的数据的段地址

例如,要读取10000H单元的内容,可以这样
mov bx, 1000H
mov ds,bx
mov al,[0]

第一步,bx=1000H
第二步,ds=ds+bx
第三步,al=[0]
意思是 将10000H(1000:0)中的数据读到al中

复习一下,
物理地址=段地址*16+偏移地址
那么
10000H=1000H*16+0000H
那么段地址位1000H,偏移地址为0000H
也就是(1000:0)

那么
把bx给了ds段地址寄存器
然后[0]直接给出偏移地址
然后al拿到指定的物理地址的值


29.能不能直接mov ds,1000H
为什么不能直接把1000H给ds
这是一个设计问题
不能直接把数据给段寄存器
一定要通过通用寄存器
所以一定要
mov ax,1000H
mov ds,ax

30.将数据送入内存单元
复习一下,刚刚学习了如何从内存单元中拿到数据
比如物理地址是12345H
那么段地址是1000H,偏移地址是2345H
那么
mov ax,1000H
mov ds,ax
mov bx,[2345]

那么把数据放入内存单元也是一样的道理
比如物理地址是54321H
那么段地址是5000H,偏移地址是4321H
那么
mov ax,5000H
mov ds,ax
mov [4321],bx


31.字的传送
因为8086是16位结构,有16根数据线,所以一次可以传送16位的数据,所以一次可以传1个字,也就是2个字节
比如
mov ax,1234H
现在ax存了16位的数据
比如物理地址是99999H
段地址是9000H,偏移地址是9999H
mov bx,9000H
mov ds,bx
mov [9999],ax


编写第一个可执行文件

1.定义一个段
segment和ends是一对成对使用的伪指令,这个是给编译器看的
segment就是开始,ends就是结束


2.END
end是结束标记,和ends是不一样的


3.看一下一段简单的代码

assume cs:codesg
codesg segment
start:
    mov ax, 3
    mov bx, 4
    add ax, bx
codesg ends
end


4.编译
先写好一个源程序文件
比如上面这个
然后将这个源程序文件编译成 可执行文件

5.复习一下简单程序
assume cs:abc
abc segment
mov ax, 3
mov bx, 4
add ax,bx
abc ends
end


6.程序返回
一个程序结束后,将CPU的控制权交还给使它得以运行的程序,这个过程叫做 : 程序返回


7.程序返回
在末尾添加返回的程序段
mov ax, 4c00H
int 21H
这两条指令的功能就是程序返回

8.描述性符号
ax中的内容为0010H
可以这样来描述 (ax)=0010H

2000:1000的内容为0010H
可以这样来描述 (21000H)=0010H

发布了1081 篇原创文章 · 获赞 42 · 访问量 21万+

猜你喜欢

转载自blog.csdn.net/qq_33781658/article/details/104529783