一个典型的CPU是由进行信息处理的运算器,进行信息存储的寄存器,和控制各种器件进行工作的控制器组成。
寄存器是cpu中程序员可以用指令读写的部件,程序员通过改变各种寄存器中的内容实现对cpu的控制。
对于8086cpu来说有14个寄存器,并且都是16位的,每一个可以存放2个字节的数据(1个字节为8bit)
这些寄存器按其用途可分为通用寄存器,指令指针,标志寄存器和段寄存器4类。
通用寄存器:
- ax, bx, cx, dx 为数据寄存器。由于8086的上一代cpu是8位的,为了兼容,是原来基于上代cpu编写的程序稍加修改就能运行在8086cpu上,所以这四个寄存器都可以分为独立使用的8位寄存器。每个寄存器的低8位(0-7)构成*L寄存器,高8位(8-15)构成了*H寄存器。
- 指针寄存器 sp(堆栈指针), bp(基数指针)。sp通常用于表示堆栈位置,bp可用作ss的一个相对基址位置。
- si(源地址)和di(目的地址)为变址寄存器。si可用来存放相对于DS段之源变址指针,di可用来存放相对于ES 段之目的变址指针。
控制寄存器:
- ip(指令寄存器)当前需要取出的指令字节,当BIU(总线控制单元)从内存中取出一个指令字节后,IP就自动加(取出该字节的长度,如:BIU从内存中取出的是1个字节,IP就会自动加1,如果BIU从内存中取出的字节数长度为3,IP就自动加3),指向下一个指令字节。注意,IP指向的是指令地址的偏移地址。
- flag (状态标志)
段寄存器:
为了运用所有的内存空间,8086设定了四个段寄存器,专门用来保存段地址:
- cs:代码段寄存器
- ds:数据段寄存器
- ss:堆栈段寄存器
- es:附加段寄存器。
其中
cs:ip指向的指令作为下一条需要取出执行的指令
mov ax, [address]是指将ds:address的数据取出赋值给ax寄存器
ss:sp在任意时刻指向栈顶元素
对于数据段,将他的段地址放在ds中,用mov,add,sub指令访问内存单元时,cpu就将我们定义的数据段中的内容当做数据来访问。
对于代码段,将它的段地址放在cs中,将段中第一条指令的偏移地址放在ip中,这样cpu就将执行我们定义的代码段中的指令。
对于栈段,将它的段地址放在ss中,将栈顶单元的偏移地址放在sp中,这样cpu在需要进行栈操作的时候,比如执行push,pop指令等,就将我们定义的栈段当做栈空间来使用。
8086汇编的相关笔记来自 小码哥 MJ iOS底层视频 以及 王爽《汇编语言(第三版)》
网友评论