汇编——段寄存器

段寄存器

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具有以下几个方面特征

  1. 运算器一次最多可以处理16位数据
  2. 寄存器的最大宽度为16位
  3. 寄存器和运算器之间的通路是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/

这个链接下有图片,,我为了省懒就这么复制粘贴了,只为学习留个资料留个纪念

时间: 2024-10-12 19:56:23

汇编——段寄存器的相关文章

栈Stack和段寄存器SS,SP(学习汇编)

1. 栈有2个基本操作:入栈.出栈 2. 栈顶的元素总是最后入栈,最先出栈:后进先出. 3. 8086CPU提供入栈和出栈的指令,最基本的两个是 PUSH(入栈) 和 POP(出栈) push ax 表示将AX寄存器的内容送入栈中, pop ax 表示从栈顶取出数据送入AX寄存器中.     8086CPU的入栈和出栈操作都是以字(word)为单位的. 4. 8086CPU中,段寄存器SS:存放栈顶段地址,段寄存器SP: 存放栈顶的偏移地址. 5. 任意时刻:SS:SP 指向栈顶元素. 6. 8

汇编之FS段寄存器

FS寄存器指向当前活动线程的TEB结构(线程结构) 偏移  说明 000  指向SEH链指针 004  线程堆栈顶部 008  线程堆栈底部 00C  SubSystemTib 010  FiberData 014  ArbitraryUserPointer 018  FS段寄存器在内存中的镜像地址 020  进程PID 024  线程ID 02C  指向线程局部存储指针 030  PEB结构地址(进程结构) 034  上个错误号 得到KERNEL32.DLL基址的方法 assume fs:no

汇编-8086内部寄存器+对段寄存器使用的约定

<微型计算机原理与接口技术(第2版)>冯博琴 吴宁 主编-清华大学出版社——做笔记用 一.8088/8086的14个16位寄存器: //------------------------------------------------------------------------------------------------------------------------------- 1.通用寄存器——8个 (1)数据寄存器——4个 AX: 累加器,常用于存放算数逻辑运算中的操作数,另外所

u-boot源码汇编段简要分析

Hi,大家好!我是CrazyCatJack,你们可以叫我CCJ或者疯猫.今天我给大家带来的是u-boot的源代码汇编段分析,以后还会给大家讲解后续的C代码,请持续关注哦^_^ 先简单说一下u-boot,在嵌入式开发中,u-boot起着至关重要的作用:读出嵌入式系统内核并启动内核.因此非常有必要对u-boot进行理解,了解其是如何启动内核的,这样我们才能随心所欲地初始化系统,无论基于什么架构,什么开发板,都能够轻松的去启动内核.这一点难道不是最有吸引力的吗? 如果大家有看到我的前一篇博客,就会对u

Orange&#39;S初始化段寄存器

最近开始看<Orange'S:一个操作系统的实现>,但因为不了解汇编,看第一个启动扇区的代码时就有疑惑: 1. 为了把cs中的值复制到ds和es中,首先需要将cs中的值复制到ax中,为什么不能直接复制? 2. mov ax, cs; mov ds, ax; mov es, ax;这三句初始化段寄存器的语句的意义是什么? 1 org 07c00h 2 mov ax, cs 3 mov ds, ax 4 mov es, ax 5 call DispStr 6 jmp $ 7 DispStr: 8

汇编语言——寄存器(内存访问 ds数据段寄存器,ss栈段寄存器)

在内存中字的存储 这段话的主要意思是:一个字=2B=16bit,CPU中是用两个内存单元储存一个字(假如获取0地址存放的字型数据,就是获取它的高位字节0+1位和低位字节0位的数据,数据由高地址位向低地址位读) 问题: (1)0地址单元中存放的字节型数据是多少? #  20H(2)0地址字单元中存放的字型数据是多少? # 4e20H(3)2地址字单元中存放的字节型数据是多少? # 12H(4)2地址单元中存放的字型数据是多少?    #  0012H(5)1地址字单元中存放的字型数据是多少? #

X86汇编2.寄存器

最近学习了X86汇编,其实无论是古老的8086还是现在i3/5/7/9,Xeon3/5,在最基本原理上,都是相通的,只是CPU位数,寻址空间,寄存器个数,指令集的扩充等方面有所不同,对于学习,8086永不过时. 1.CPU组成一个典型CPU由:运算器.控制器.寄存器(CPU工作原理)等部件构成,这些器件依靠内部总线连接.运算器进行信息处理寄存器进行信息存储,每个CPU有不同数量的寄存器控制器控制各种器件进行工作内部总线连接各种器件,在他们之间进行数据的传送 对于一个汇编程序员来说,寄存器是CPU

CPU的段寄存器

http://www.cnblogs.com/tolimit/p/4775945.html?utm_source=tuicool&utm_medium=referral CPU的段寄存器 在CPU中,跟段有关的CPU寄存器一共有6个:cs,ss,ds,es,fs,gs,它们保存的是段选择符.而同时这六个寄存器每个都有一个对应的非编程寄存器,它们对应的非编程寄存器中保存的是段描述符.系统可以把同一个寄存器用于不同的目的,方法是先将其寄存器中的值保存到内存中,之后恢复.而在系统中最主要的是cs,ds

汇编各寄存器的作用说明

4个数据寄存器(EAX.EBX.ECX和EDX)2个变址和指针寄存器(ESI和EDI) 2个指针寄存器(ESP和EBP)6个段寄存器(ES.CS.SS.DS.FS和GS)1个指令指针寄存器(EIP) 1个标志寄存器(EFlags) 1.数据寄存器数据寄存器主要用来保存操作数和运算结果等信息,从而节省读取操作数所需占用总线和访问存储器的时间.32位CPU有4个32位的通用寄存器EAX.EBX.ECX和EDX.对低16位数据的存取,不会影响高16位的数据.这些低16位寄存器分别命名为:AX.BX.C