段寄存器(8086CPU)和代码段

1.段寄存器

8086CPU有4个段寄存器:CS、DS、SS、ES。当8086CPU访问内存时,由这4个段寄存器提供内存单元的段地址。

CS和IP是8086中最关键的寄存器,他们指示了CPU当前要读取指令的地址。CS是代码段寄存器,IP为指令指针寄存器。在8086PC机中,任意时刻,设CS中的内容是M,IP中的内容是N,8086CPU将从内存地址:M*16+N处读取指令并执行。也可以这样表述,8086机中,任意时候,CPU将CS:IP指向的内容当做指令执行,。CPU将CS、IP中的内容当做指令的段地址和偏移地址,用他们合成物理地址。

2.更改CS:IP的值

mov指令没法完成这个任务,8086CPU为CS:IP提供了另外的指令来改变他们的值:转移指令

比如,想同时修改CS:IP的内容:jmp 段地址:偏移地址。jmp 2AE3:3。功能:用指令中的段地址修改CP,偏移地址修改IP。

想修改IP的内容,可用指令“jmp 寄存器”来完成,jmp ax功能类似mov IP,ax.

jmp ax
指令执行前:ax=1000H,CS=2000H,IP=0003H

指令执行后:ax=1000H,CS=2000H,IP=1000H

3.代码段

对于8086PC机,在编程时,可以根据需要,将一组内存单元定义为一个段。

可以将长度为N(N<64)的一组代码,存在一组连续地址、起始地址为16的倍数的内存单元中,这段内存是用来存放代码的,从而定义一个代码段。

将一段内存当做代码段,仅仅是我们编程时的一种安排,CPU并不会由于这种安排就自动地将我们定义得代码段中的指令当做指令执行。

CPU只认被CS:IP指向的内存单元中的内容为指令

段寄存器(8086CPU)和代码段,码迷,mamicode.com

时间: 2024-10-09 19:56:53

段寄存器(8086CPU)和代码段的相关文章

一致代码段和非一致代码段

最近在自己动手写操作系统,计算机其实是一个非常复杂的系统.其中包含了很多历史性的问题,让人感到生僻难懂.在CSDN上看到一篇关于一致代码段和非一致代码段的文章,非常好,收藏起来. 原文链接:http://blog.csdn.net/feijj2002_/article/details/4597174 之所以出现这个定义是因为系统要安全:内核要和用户程序分开..内核一定要安全.不能被用户程序干涉.但是有时候用户程序也需要读取内核的某些数据,怎么办呢?操作系统就引入了访问特权等级(0-3)的机制.

【从头开始写操作系统系列】一致代码段与非一致代码段

上几篇文章,我们一直在讨论的都是 GDT 相关的一些问题,现在我们知道在系统在从实模式向保护模式跳转时,GDT 是必须要准备的结构.在介绍这一跳转之前,这篇文章我们来介绍两个概念:一致代码段和非一致代码段. 首先,我们先来看几个问题: 一致代码段和非一致代码段是什么? 为什么要有一致代码段和非一致代码段? 系统提供怎样的机制来使用户程序访问内核数据? 程序如何在段与段之间跳转? 接下来,我们将讨论上述这些问题. 特权级 为了更好的理解之后的问题,我们先来讨论一个概念:特权级. 特权级是一种机制来

《80X86汇编语言程序设计教程》十一 32位代码段和16位代码段切换实例

1.  演示32位代码段与16位代码段之间的切换.实现的功能是以十六进制和ASCII码字符两种形式显示从内存地址100000H开始的16个字节的内容. 2.  源代码如下: 1 ;DosTest.Asm 2 ;16位偏移的段间转移指令的宏定义 3 ;使用于16位段,用于跳转到32位目的段 4 ;注意:标号偏移必须在16位二进制符号数数能表示的范围之内 5 JUMP16 macro selector,offsetv 6 db 0eah ;操作码 7 dw offsetv ;16位偏移 8 dw s

操作系统学习(十一) 、一致代码段和非一致代码段

一.概述 操作系统保护模式下把代码段分为一致代码段和非一致代码段的原因是:内核程序和用户程序要分开,内核程序不能被用户程序干扰.但是有时候用户程序也需要读取内核的某些数据,于是操作系统就从内核程序中分配一些可以供用户程序访问的段,但是不允许用户程序写入数据,用户程序访问这些段时遵循以下规则: 内核程序不知道用户程序的数据,不调用用户程序的数据,也不转移到用户程序中来 用户程序只能访问到内核的某些共享段,这些段称为一致代码段 用户程序不能访问内核不共享的段 二.一致代码段 一致代码段:简单理解就是

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

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

内存布局:栈,堆,BSS段(静态区),代码段,数据段

摘自:https://www.cnblogs.com/Spider-spiders/p/8884729.html 简介 我们程序运行的时候都是放在内存里的.根据静态.成员函数.代码段.对象.等等.放在不同的内存分块里.大概分为5块 1  栈 2  堆 3 BSS段-全局区-(静态区) 4 代码段 5 数据段 栈 存放局部变量.临时变量.声明.返回值.指向堆对象的地址(指针).总之存放一些小的东西.当不需要时候.栈会自动清除.比如一个加法方法里面.声明了两个int并赋值.这两个就是放在栈里面.类里

寄存器与代码段

汇编语言系列学习笔记: 汇编语言初探 寄存器与代码段(本文) 寄存器与数据段(待完成) 寄存器与栈段(待完成) 在上一篇博文中主要介绍了学习汇编语言的一些必备知识.其中和这篇文章联系比较紧密的是内存地址单元与 CPU 的概念,不熟悉的可以先行阅读上一篇博文. 在学习寄存器这两章内容的时候,首先要牢记一个观点:指令和数据在内存单元中没有任何区别,它们都是一些二进制信息. CPU 在读取内存中二进制信息的时候,将有的信息看作指令,有的信息看作数据. 在接下来的三篇博文中将具体介绍 CPU 到底是根据

汇编——段寄存器

段寄存器 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         

段寄存器与逻辑地址的相关内容

寄存器操作数:(存放在CPU中) MOV AX,0FFFFH AX 即为寄存器操作数. 操作数本身存放于寄存器中,在指令中只是给出了几个位的代码来表示它具体存放在那个寄存器中. 内存中的数据经过寄存器读入CPU,进入数据的运算. 内存操作数:(存放在内存中) 其存储于某内存区域,因此叫内存操作数. mydata dw 1234H 或 mydata db 12H等 上述中mydata这样的变量 xx db 0FFH,0 mov bx, OFFSET xx //用offset运算符计算出xx单元的偏