基础知识
是直接在硬件上工作的编程语言。
汇编语言的组成
汇编指令
eg:mov ax,bx
伪指令
其它符号
cpu对存储器的读写
一般划分为,地址总线,数据总线和控制总线
地址总线
cpu通过地址总线来指定存储单元,地址总线传送多少不同的信息,cpu就可以对多少存储单元进行寻址。
一个cpu有N个地址总线,这个cpu的地址总线宽度为N,它最多可以寻找2^N个内存单元。
数据总线
进行数据传送
它的宽度决定了cpu与外界的数据传送速度。
控制总线
它是一些不同控制线的集合。
控制总线的宽度决定了cpu对外部器件的控制能力。
内存地址空间
一个cpu的地址线宽度为10,那就可以寻址1024个内存单元,这1024个内存单元就构成了cpu的内存地址空间。
主板
主板上有一些主要器件,均通过总线相连。
接口卡
cpu不能对外部设备直接控制,直接控制的是插在扩展槽上的接口卡。
存储器芯片
读写属性上分为
随机存储器(RAM)和只读存储器(ROM)
从功能和连接上分为
随机存储器RAM,装有BIOS的ROM,接口卡上的RAM
BIOS
基本输入输出系统,由主板和各类接口卡厂商提供的软件系统
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Nuf5Ufq8-1665645686575)(C:\Users\25964\AppData\Roaming\Typora\typora-user-images\image-20220904101309153.png)]
上述存储器在物理上为独立的器件,但是有两点相同
均和cpu的总线相连
cpu对它们进行读写时都通过控制线发出内存读写命令
可以将各类存储器看作一个逻辑存储器:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-G087pG2m-1665645686576)(C:\Users\25964\AppData\Roaming\Typora\typora-user-images\image-20220904101744761.png)]
寄存器(cpu工作原理)
cpu概述
一个典型的CPU由运算器,控制器,寄存器的器件组成,均靠内部总线相连。
寄存器概述
8086cpu有14个寄存器,分别为
AX BX CX DX SI DI SP BP IP CS SS DS ES PSW
通用寄存器
8086cpu所有的寄存器均为16位,可以存放两个字节。
AX BX CX DX通常用来存放一般性数据被称为通用寄存器。
eg:
数据:18
二进制表示:10010
在寄存器AX中的存储:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jhcaY56t-1665645686576)(C:\Users\25964\AppData\Roaming\Typora\typora-user-images\image-20220904103201702.png)]
一个16位寄存器能存储的数据的最大值为2^16-1。
以AX为例
为了保证兼容性,它可以分为两个独立的8位寄存器:AH和AL
字在寄存器中的存储
一个字可以寄存在16位的寄存器中,分别分布于高八位和第八位。
部分汇编指令
#汇编指令不区分大小写
mov ax,18-----将8送入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+BX
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6TO43eUs-1665645686577)(C:\Users\25964\AppData\Roaming\Typora\typora-user-images\image-20220904104902884.png)]
?=1044CH
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0wVFybUc-1665645686577)(C:\Users\25964\AppData\Roaming\Typora\typora-user-images\image-20220904105213303.png)]
?=0058H
物理地址
所有的内存单元构成的储存空间是一个一维的线性空间。称为物理地址。
16位结构的cpu
#特征
运算器一次最多可以处理16位的数据。
寄存器的最大宽度为16位。
寄存器和运算器之间的通路是16位。
8086有20位地址总线,可传送20位地址,寻址能力为1M。其内部为16位结构,只能传送16位的地址,表现出的寻址能力只有64k。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XLGaTWKl-1665645686578)(C:\Users\25964\AppData\Roaming\Typora\typora-user-images\image-20220904191330206.png)]
当8086cpu读写内存时,发生了一些事:
1.cpu相关部件提供两个16位的地址,一个为段地址,另一个为偏移地址。
2.段地址和偏移地址通过内部总线送入一个称为地址加法器的部件
3.地址加法器将两个16位地址合并成一个20位的地址
地址加法器工作原理:
物理地址
=
段地址
∗
16
+
偏移地址
物理地址=段地址*16+偏移地址
物理地址=段地址∗16+偏移地址
eg:
8086cpu访问地址为123C8H的内存单元。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KnRSQeFL-1665645686578)(C:\Users\25964\AppData\Roaming\Typora\typora-user-images\image-20220904191951205.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AREs6njY-1665645686578)(C:\Users\25964\AppData\Roaming\Typora\typora-user-images\image-20220904192203541.png)]
段的概念
由于8086cpu用“(段地址*16)+偏移地址=物理地址”的方式给出内存单元的物理地址,使我们可以用分段的方式来管理内存。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GmV1kV1g-1665645686579)(C:\Users\25964\AppData\Roaming\Typora\typora-user-images\image-20220904193300821.png)]
#注意
1.段地址*16必然是16的倍数,所以一个段的起始地址也一定是16的倍数。
2.偏移地址为16位,16位地址的寻址能力为64k,所以一个段的长度最大为64k。
cpu访问内存单元时,必须向内存提供内存单元的物理地址。
8086cpu在内部用段地址和偏移地址移位相加的方法形成最终的物理地址。
也就是说,它可以使用不同的段地址和偏移地址形成同一个物理地址。
偏移地址为16位,变化范围为0-FFFFH,仅用偏移地址最多可循64k个存储单元。
段寄存器
它用来提供段地址,共有4个段寄存器:
CS,DS,SS,ES
CS和IP
CS和IP是8086中最关键的寄存器,它们指示了cpu当前要读取指令的地址。
CS为代码段寄存器,IP为指令指针寄存器。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CbH7P2W5-1665645686579)(C:\Users\25964\AppData\Roaming\Typora\typora-user-images\image-20220905165103923.png)]
#工作过程简要描述
1.从CS:IP指向内存单元读取指令,读取的指令进入指令缓冲器。
2.IP=IP+所读取指令的长度,从而指向下一条指令
3.执行指令并转回到步骤一。
在任何时候,CPU将CS,IP中的内容当作指令的段地址和偏移地址,用它们合成指令的物理地址,到内存中读取指令码并执行。
若内存中一段信息曾被cpu执行过,那么它所在的内存单元必然被CS:IP指向过。
修改CS,IP指令
转移指令:jmp段地址——偏移地址
jmp 2AE3:3————修改到2AE33
jmp 3:0B16————修改到0B46
功能:用指令中给出的段地址修改CS,偏移地址修改IP。
若仅修改IP内容:
jmp ax 类似于 mov IP,ax
功能:用寄存器中的值修改IP
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-N8ncAc0W-1665645686580)(C:\Users\25964\AppData\Roaming\Typora\typora-user-images\image-20220905170323207.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2XSt1y2O-1665645686580)(C:\Users\25964\AppData\Roaming\Typora\typora-user-images\image-20220905170343039.png)]
代码段
将长度为N的一组代码,存在一组地址连续,起止地址为16的倍数的内存单元中,这段内存是用来存放代码的,从而定义了一个代码段。
eg:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UX0IkefP-1665645686580)(C:\Users\25964\AppData\Roaming\Typora\typora-user-images\image-20220905170819334.png)]
字节长度为10
段地址为123BH
cpu只认被CS:IP指向的内容
所以要将CS:IP指向所定义的代码段中的第一条指令叫做首地址。
实验一
查看CPU和内存,用机器指令和汇编指令编程。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-M6R8D8SM-1665645686581)(C:\Users\25964\AppData\Roaming\Typora\typora-user-images\image-20220905172045442.png)]
寄存器(内存访问)
内存中字的存储
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LCvMZvXj-1665645686581)(C:\Users\25964\AppData\Roaming\Typora\typora-user-images\image-20220905183159245.png)]
#结论
任何两个地址连续的内存单元,N单元和N+1号单元,可以将它们看成两个内存单元,也可以看成一个地址为N的字单元中的高位字节单元和低位字节单元。
DS和address
cpu要读取一个内存单元的时候,必须先给出这个内存单元的地址:
8086有一个DS寄存器,通常用来存放要访问的数据的段地址。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Q1gBEw5M-1665645686581)(C:\Users\25964\AppData\Roaming\Typora\typora-user-images\image-20220905183716529.png)]
#mov 寄存器名,内存单元地址
可以将数据直接送入寄存器
将一个寄存器的内容送入另一个寄存器中
将一个内存单元中的内容送入一个寄存器
上述中,[…]表示一个内存单元,其中的0表示内存单元的偏移地址。
在执行指令时,8086会自动取DS中的数据为内存单元的段地址。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VrboMAR1-1665645686581)(C:\Users\25964\AppData\Roaming\Typora\typora-user-images\image-20220905184517116.png)]
#注意:
8086不支持将数据直接送入段寄存器
正常为数据->通用寄存器->段寄存器
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AKcTQmpf-1665645686582)(C:\Users\25964\AppData\Roaming\Typora\typora-user-images\image-20220905184826825.png)]
字的传送
8086是16位结构,有16根数据线,一次可传送16位数据,也就是一次性传送一个字。
mov bo,1000H
mov ds,bx
mov ax,[0] --1000:0处的字型数据送入ax
mov [0],cx --cx中的16位数据送到1000:0处
eg:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4YUqoz4z-1665645686582)(C:\Users\25964\AppData\Roaming\Typora\typora-user-images\image-20220905185348453.png)]
ax=1123
bx=8833
cx=8833
mov、add、sub指令
#mov
mov 寄存器,数据
mov 寄存器,寄存器
mov 寄存器,内存单元
mov 内存单元,寄存器
mov 段寄存器,寄存器
mov 寄存器,段寄存器
#add与sub与上述相同
数据段
将一组长度为N,地址连续且起止地址为16的倍数的内存单元当作专门存储数据的内存空间,从而定义了一个数据段。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9jlRHsbm-1665645686582)(C:\Users\25964\AppData\Roaming\Typora\typora-user-images\image-20220906154459261.png)]
如果要累加字型数据,则
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IGAw3Znw-1665645686582)(C:\Users\25964\AppData\Roaming\Typora\typora-user-images\image-20220906154803954.png)]
一个字型数据为两个单元
栈
栈是一种具有特殊的访问方式的存储空间,最后进入的最先出去。
cpu所提供的栈机制
也意味着,在基于8086编程时,可以将一段内存当作栈来使用。
PUSH ax:将寄存器ax中的数据送入栈中
pop ax:从栈顶取出数据送入ax
8086出入栈的操作均以字为单位来进行。
eg:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-omHV5HvI-1665645686583)(C:\Users\25964\AppData\Roaming\Typora\typora-user-images\image-20220906161016609.png)]
ax=1122
bx=2266
cx=0123
寄存器CS和IP种存放着当前指令的段地址和偏移地址。
段寄存器SS存放栈顶的段地址。
寄存器SP存放栈顶的偏移地址。
任意时刻,SS:SP指向栈顶元素
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HtgHWWAb-1665645686583)(C:\Users\25964\AppData\Roaming\Typora\typora-user-images\image-20220915102336126.png)]
栈顶超界问题
当栈满的时候再使用push指令入栈,栈空再使用pop命令出栈,都会发生栈顶超界问题。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2Sn7fQVX-1665645686583)(C:\Users\25964\AppData\Roaming\Typora\typora-user-images\image-20220915103423313.png)]
push与pop指令
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wl0SbIlL-1665645686583)(C:\Users\25964\AppData\Roaming\Typora\typora-user-images\image-20220915103924778.png)]
`
8086出入栈的操作均以字为单位来进行。
eg:
[外链图片转存中…(img-omHV5HvI-1665645686583)]
ax=1122
bx=2266
cx=0123
寄存器CS和IP种存放着当前指令的段地址和偏移地址。
段寄存器SS存放栈顶的段地址。
寄存器SP存放栈顶的偏移地址。
任意时刻,SS:SP指向栈顶元素
[外链图片转存中…(img-HtgHWWAb-1665645686583)]
栈顶超界问题
当栈满的时候再使用push指令入栈,栈空再使用pop命令出栈,都会发生栈顶超界问题。
[外链图片转存中…(img-2Sn7fQVX-1665645686583)]
push与pop指令
[外链图片转存中…(img-wl0SbIlL-1665645686583)]