笔记目录
第二章 寄存器-笔记+个人理解
1 CPU的组成
cpu是中央处理器的简称(Central Processing Unit),其功能是负责对数据进行运算、控制,其组成主要是由运算器、控制器组成。那寄存器在cpu中充当什么角色呢?这个很容易想通,控制器维持着整个cpu有条不紊的工作,运算器负责数据运算处理,那处理运算的结果总得有地方暂存吧?你可能会想数据放在内存就好了啊(理论上是可以,但其他的不说,cpu的工作速度远高于内存,如果数据放在内存,那cpu<-总线->主存之间相互传输数据就会存在严重速度差,严重影响cpu效率),而寄存器就是一个很好暂存数据/指令的器件。(个人理解,有错误和不足的望大佬评论区指点🙏)
2 寄存器种类
2.1 通用寄存器
8086机器中的寄存器是16位的,可以存放两个字节的数据。通用寄存器有:AX,BX,CX,DX,这几个寄存器用来存放一般的数据,所以叫通用通用寄存器。
- 如果想要操作AX寄存器里的低位字节数据(低8位),使用AL,操作高位字节数据(高8位),使用AH。
- 其他的通用寄存器也是一样操作低位或者高位时,操作 YL,YH(Y表示A~D,L表示低,H表示高)
2.2 几条常用的汇编指令
1、指令举例如下
1、mov ax,18 ;将18这十进制数送入到寄存器ax中
2、mov ah,78 ;将78送入到寄存器ah的内容中(ax的高位8~15位)
4、mov bx,042EH ;将42E这个十六进制数送入到bx寄存器中
5、add ax,8 ;将ax寄存器里的数值加上8
6、mov ax,bx ;将寄存器bx的内容取出送入到ax寄存器中
7、add ax,bx ;将ax寄存器里的数值与bx寄存器里的数值相加结果送入到ax中(替换掉原先的)
备注:汇编指令及程序中不区分大小写,给定一个数值(没有后缀),默认是十进制,即数值后缀是d(可以省略),十六进制数的后缀是H,八进制数的后缀是O,二进制数的后缀是B,分号";"表示注释
2、数据溢出问题
把一个数据或者执行指令运算后的数值放入到寄存器里,如果数值超出寄存器本身能存储的范围,则超出的高位部分直接丢弃即可。
举例:mov ax,88224h ;寄存器里最终的值为8224h
举例:add ax,8226h ;如果此时ax里的数值也是8226h,执行指令后ax寄存器里的数值为044Ch,
因为8226h+8226h的结果为1044Ch,而寄存器位16位,只能存放4位十六进制表示的数据,因此结果为044Ch
2.3 段寄存器(存放段地址的寄存器)
8086cpu中有CS、DS、SS、ES这四个寄存器是段寄存器,意思是当cpu访问内存单元时,由这几个寄存器提供内存单元的段地址。(仅涉及功能和原理,不涉及具体语法)
- CS:代码段寄存器,提供代码所在的段地址。程序的汇编指令放在这个这块内存中,CS结合IP指令指针寄存器提供的偏移地址共同来确定某个内存单元。
- DS:数据段寄存器,提供数据所在的段地址。cpu访问内存单元时,主要由它提供数据所在段的地址,偏移地址用户可以自定,从而达到访问具体某个内存单元。
- SS:栈段寄存器,提供栈所在的段地址,栈在高级语言中是一种限制只能在一端操作线性表,具有FILO(先进后厨)的特点,而在汇编语言中提供一种机制,把一段内存空间当作段使用,SS提供的就是这块内存空间的段地址,SS结合SP(栈顶元素的地址/栈偏移地址)来共同确定栈顶所在内存的单元地址。
- ES:附加段存储器,是一个扩展寄存器,当你想存放某块内存的段地址时,发现其他寄存器不够用,则可以存入ES。
CS和IP的工作原理
- CS和IP两个寄存器的作用从其名字知晓和指令有关。现在cpu要访问内存进行取指操作,CS和IP分别提供和指令所在内存的段地址和偏移地址送入到地址加法器中并被其合并为物理地址(指令所在的内存单元地址),通过输入输出电路及地址总线传输到主寄存器中,找到物理地址对应的单元后并取出里面的内容通过数据总线、控制电路传输到指令缓冲器,由控制器控制执行指令,同时IP自增3(因为汇编指令mov ax,0123H对应的机器码占3个字节),取指过程完成。
3 转移指令初探
8086cpu中的寄存器大部分都可以使用mov指令修改值,但是不能修改CS:IP两个寄存器的内容,因为在8086cpu设计初就没有设计这样的功能,没有支持这样功能的电路。那怎么修改?我们把这类修改CS和IP内容的指令统称为”转移指令“。jmp指令就是其中之一:
语法:
- 1、jmp 段地址:偏移地址,例如:jmp 076A:0 即同时修改cs和ip的内容分别为076A和0
- 2、jmp 合法的寄存器,例如:jmp ax 即单独修改ip寄存器里的内容,cs内容不变
4 代码段
"段"是cpu对内存单元的一种逻辑划分方式,而内存可以看作是一块连续不断的内存单元组成。因此,在汇编语言中,用户可以自己定义各式各样的段,主要有数据段、栈段、代码段。段定义后,并往相应的段放入适合的数据(数据段-主放数据,代码段-主放汇编指令,栈段-可以放数据或者其他),但是cpu并不会知道你定义的代码段(程序的入口)在哪里从哪开始/结束程序,它只认CS:IP指向的内存单元,因此把CS:IP指向我们定义的代码段的第一个单元的首地址是必要的。
这样CS和IP就指向自己定义的代码段的第一条指令的首地址了。
(备注:源程序文件中至少有一个段)
8086机器环境资源免费获取
链接:https://pan.baidu.com/s/1aRv4k6DVlJtGkHQDB6WjrA
提取码:8086