汇编——段寄存器
Posted 码农的笔记
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了汇编——段寄存器相关的知识,希望对你有一定的参考价值。
段寄存器
8086CPU有14个寄存器
AX,BX,CX,DX,si,di,sp,bp,ip,cs,ss,ds,es,psw
其中有8个通用寄存器
8086寄存器16位,可以存放两个字节
AX BX CX DX一般用来存放一般数据
为保证兼容性,这四个寄存器可以分为两个独立的8位寄存器使用
AX可以分为AH和AL
H高L低
同样的对于ABCD-X
字在寄存器中的存储
一个字可以存在一个16位寄存器中
Word=2B
关于数制的讨论
二进制太冗长
几条汇编指令
Mov ax,18 将18送入 AX = 18
Add ax,8 将寄存器AX中的数制加上8 AX = AX + 8
Mov ax,bx 将寄存器BX中的数据送入寄存器AX中 AX = BX
例如如果在寄存器中加法数据超过了16位
例如
AX = 8226H BX =8226H
Add ax,bx
Ax=044c
Ax值应该为1044C但是最高位溢出,但是CPU并不会抛弃该内容,但是1会放到进位寄存器中
这里的丢失,指的是进制位不能再8位寄存器中保存,但是CPU不是真的丢弃这个进位值,该问题在后面讨论。
Cpu访问内存单元是要给出内存单元的地址。所有的内存单元构成的存储空间是一个线性空间。
我们将这个唯一的地址成为物理地址。
16位结构的CPU
概括的讲,16为结构描述了一个CPU具有以下几个方面特征
- 运算器一次最多可以处理16位数据
- 寄存器的最大宽度为16位
- 寄存器和运算器之间的通路是16位的
8086有20位地址总线,可传送20位地址,寻址能力为1M
内部为之流微结构,只能传送16位的地址,表现出的寻址能力却只有64k
8086采取一种在内部用两个16位地址合成的方法来形成一个20位的物理地址
16位段地址和16为偏移地址,通过地址加法器转换成20位物理地址
地址加法器合成物理地址的方法
物理地址 = 段地址 * 16 + 偏移地址
十六进制数据相当于向左移一位
相应的如果是二进制数则向左移四位
例如
8086CPU访问地址为123C8H的内存单元
简单的可以推算到,一个数据的二进制形式左移N位,相当于该数据乘以2的N次方
所以对于地址加法器完成*16的步骤相当于左移4位
段地址错误的概念
内存被划分成了一个一个短,每一个段都有一个段地址的认识是错的
内存划分来自于CPU,由于8086CPU用“(段地址*16)+偏移地址=物理地址”的方式给出内存单元的物理地址,使得我们可以分段的方式来管理内存
两点需要注意
1) 段地址*16必然是16的倍数,所以一个段的起始地址也一定是16的倍数
2) 偏移地址为16位,16为地址的寻址能力为64K,所以一个段长度最大为64K
内存单元地址小结
1)CPU访问内存单元时,必须向内存提供内存单元的物理地址
2)8086CPU在内部用段地址和偏移地址移位相加的方法形成最终的物理地址
3)CPU可以用不同的段地址和偏移地址形成同一个物理地址
8086CPU中存储单元用两个元素来猫叔,即段地址和偏移地址
数据在21F60H内存单元中,对于8086有两种描述
a) 数据在内存2000:1F60单元中
b) 数据存在内存的2000段中的1F60H中
可根据需要,降低至连续起始位置为16的倍数的一组内存单元定义为一个段
段寄存器
段寄存器就是提供段地址的
8086CPU有四个段寄存器
CS DS SS ES
Code segment
Data segment
Stack segment
Extra Segment
当8086CPU要访问内存时,由这4个段寄存器提供内存单元的段地址
CS和IP
其实8086CPU中最关键的寄存器,他们指示了CPU当前要读取指令的地址
CS为代码段寄存器 code segment
IP为指令指针寄存器
工作过程的简要描述
1) 从CS:IP指向内存单元读取指令,读取的指令进入指令缓冲器
2) IP = IP+ 所读取指令唱的,从而指向下一条指令
3) 执行指令,转到步骤1,重复这个过程
8086PC工作过程的简要描述
1)在8086CPU加电启动活着复位时,CS=FFFFH ,IP= 0000H
2)即在8086PC机刚启动时,CPU从内存FFFF0H单元中读取指令执行
3)FFFF0H单元中的指令是8086PC机开机后执行的第一条指令
CS和IP在任何时候CPU将CS和IP的内容当成指令的段地址和偏移地址,用他们合成失灵的物理地址,到内存中读取指令码执行。
如果说,内存中的一段信息曾将被CPU执行过的话,那么它所在的内存单元必然被CS:IP指向过。
修改CS,IP指令
在CPU中,程序员能够用指令读写的部件只有寄存器,程序员可以通过改变寄存器中的内容实现对CPU的控制。
CPU从何处执行指令是由CS,IP中的内容决定的,程序员可以通过改变CS,IP中的内容来控制CPU执行目标指令
我们如何改变CS,IP的值
我们如何修改AX的值
Mov
如mov ax,123
Mov指令可以改变8086CPU大部分寄存器的值,被称为传送指令
??能够通过mov改变cs,ip值吗?
不行,但是8086提供了体术的指令jmp
Jmp段地址:偏移地址
Jmp 2AE3:3 (2AE33)
Jmp 3:0B16 (00B46)
功能:用指令中给出的段地址修改CS,偏移地址修改IP
仅修改IP内容
Jmp 某一合法寄存器
Jmp ax(类似于mov IP,ax)
Jmp bx
功能 :用寄存器中的值修改IP
问题分析:CPU运行的流程
代码段
对于8086PC机,在编程时,可以根据需要,将一组内存单元定义为一个段。
可以将长度为N(N《=64K)的一组代码,存在一组地址连续,其实地址为16的倍数的内存单元中,这段内存使用来存放代码的,从而定义了一个代码段
例如
如何使代码段的指令被执行呢?
讲一段内存当作代码段,仅仅是我们在编程时的一种安排,CPU并不会有由于这种安排,就自动地将我们定义的代码段中的指令当做指令来执行
因为CPU只认被CS:IP指向的内存单元中的内容为指令
所以只要将CS:IP只想多定义的代码段中的第一条指令的首地址
小结
段地址在8086CPU的寄存器中存放,当8086CPU要访问内存时,由段寄存器提供内存单元的段地址。8086有4个段寄存器,其中cs用来存放指令的段地址。
Cs存放指令的段地址,IP存放指令的偏移地址
8086机中,任意时刻,CPU将CS:IP指向的内容当做指令执行
转自:http://blog.163.com/willwang_blog/blog/static/2212130942013581154349/
这个链接下有图片,,我为了省懒就这么复制粘贴了,只为学习留个资料留个纪念
以上是关于汇编——段寄存器的主要内容,如果未能解决你的问题,请参考以下文章