内存管理机制与TC编译模式.ppt

上传人:xt****7 文档编号:5310214 上传时间:2020-01-25 格式:PPT 页数:23 大小:814.81KB
返回 下载 相关 举报
内存管理机制与TC编译模式.ppt_第1页
第1页 / 共23页
内存管理机制与TC编译模式.ppt_第2页
第2页 / 共23页
内存管理机制与TC编译模式.ppt_第3页
第3页 / 共23页
点击查看更多>>
资源描述
2020 1 25 1 第八章内存管理机制与TC编译模式 寄存器和伪变量内存的寻址模式TC的编译模式 2020 1 25 2 第一节寄存器和伪变量 寄存器是CPU中的部件 用来存储数据 地址和指令 8086 8088 80286的CPU只有14个寄存器 都是16位寄存器其中AX BX CX DX每个都可以分为两个8位寄存器来使用 2020 1 25 3 80386之后的CPU对前十个寄存器做了扩充 32位 同时又增加了两个寄存器FS和GS 如图所示 TC只支持14个寄存器且认为它们都是16位的 2020 1 25 4 程序中 有时候需要操作这些寄存器 为了能在TC中使用它们 TC定义了一些伪变量以对应相应的寄存器 AX 对应寄存器AX AH 对应寄存器AH AL 对应寄存器AL BX 对应寄存器BX BH 对应寄存器BH BL 对应寄存器BL CX 对应寄存器CX 例如 若要将字符 A 置于AL中 则可用 AL A 若要将整数100置于AX中 则可用 AX 100 2020 1 25 5 第二节内存的寻址模式 实模式寻址保护模式寻址默认的段寄存器近程指针与远程指针与地址操作有关的几个函数 宏 2020 1 25 6 一 内存的实模式 8086 8088 80286的CPU都是16位的 对应的数据总线 地址总线 控制总线也 应 是16位 但16位的地址总线只能寻址65536个内存单元 64K 显然太小了 当时认为寻址能力达到1M就够用了 故将地址总线设定成了20位 20位的地址不便用16位的CPU处理 因此当时采用了一种将内存分段的方法 来解决这个问题 2020 1 25 7 从内存的任意一个 地址能被16整除 的单元开始 将该单元之后的共64K内存划为一个 段 之所以要求段的起点必须是16的倍数 是为了把段的首地址存入段寄存器中 只能存16位 在一个段内 任意单元的地址都可以用一个相对于段起点的地址来表示 称作偏移地址 偏移地址是一个16位的无符号整数 2020 1 25 8 如图 段的起始地址是00030H 则段寄存器中存储的是0003H 图中00072单元的偏移地址是0042H段内任意单元的地址都可以表示成 段地址 偏移地址 的形式 00072单元的地址可表示为 0003 0042段与段可以重叠 如图所示另一段的基址00050H 此时00072H的地址又可表示为 0005 0022 2020 1 25 9 可见 同一个物理地址可有多种不同的表示法采用这种分段的方式使寻址能力达到了1M 但是这种寻址方式缺乏对内存的有效保护为了区别后来的保护模式 将上述内存分段寻址的方式称作实地址模式或内存的实模式 2020 1 25 10 二 内存的保护模式 为了保护内存 需要记录段的首地址 段长度 段的访问权限等信息 这些信息合起来是一个64位的数据结构 段描述符显然 段寄存器存储不下这个段描述符解决方法 在内存中开辟一段区域 按顺序存储所有段的段描述符 组成一个段描述符表段寄存器中只存储段描述符的索引 段选择子 2020 1 25 11 三 默认的段寄存器 CS 总是存储代码段的基址DS 总是存储数据段的基址ES 总是存储附加段的基址SS 总是存储堆栈段的基址 2020 1 25 12 四 近程指针和远程指针 近程指针是一个16位的指针 用来在段内寻址 近程指针在定义时 使用near关键字说明 可以省略 如 intnear p 或int p p用于在数据段内寻址 p存储的是数据段内的偏移地址 而数据段的首址固定在DS中 2020 1 25 13 四 近程指针和远程指针 近程指针的最大值只能到0 xffff 即65535 超过将出错 如 charnear p p charnear 0 xffff p printf p n p p是用十六进制输出地址其运行结果是 0000因为65535加1将产生进位 丢弃 使p的16位都是0 这种现象称作折回 2020 1 25 14 四 近程指针和远程指针 远程指针是一个32位的指针 用来寻址不同的段 其中高位的两个字节存储段值 低位的两个字节存储偏移地址 由于远程指针对应的数据可以在不同的段 故数据段寄存器中的段基址可能会发生改变 远程指针定义时用far说明 如 charfar p p charfar 0 x2A000002 对远程指针加减运算 只对偏移地址进行 段地址不参与运算 故也会发生折回现象 2020 1 25 15 四 近程指针和远程指针 对于同一个物理地址 用 段地址 偏移地址 的方式表示时 可以有若干种形式 如物理地址1234H可以表示为 0000 1234 0001 1224 0002 1214 虽然这些地址表示的是同一物理地址 但如果对它们进行比较 得出的结果是不相等 设远程指针p1 p2存储的是同一物理地址 但段地址和偏移地址不同 则表达式p1 p2的值为0 因为计算机是直接比较两个指针变量中的32位二进制数 而不是转化为物理地址后再比较 2020 1 25 16 五 与地址操作有关的几个函数 TC在dos h中定义了几个函数 实际是宏 用来处理段地址或偏移地址FP SEGFP OFFMK FPpeekb和peekpokeb和poke 2020 1 25 17 五 与地址操作有关的几个函数 1 FP SEG功能 获取远地址中的段值原型 unsignedFP SEG voidfar farptr 例8 1 include includeintmain charfar filename fpseg c printf 04x n FP SEG filename 0表示用0补足4位return0 2020 1 25 18 五 与地址操作有关的几个函数 2 FP OFF功能 获取远地址中的偏移地址原型 unsignedFP OFF voidfar farptr 例8 2 include includeintmain charfar str fpoff c printf 04x n FP OFF str return0 2020 1 25 19 五 与地址操作有关的几个函数 3 MK FP功能 由段值和偏移地址组成一个远程指针 原型 voidfar MK FP unsignedseg unsignedoff 例8 3 主要程序段 charfar p unsignedseg off p MK FP 0 xb000 0 x20 seg FP SEG p off FP OFF p printf farp Fp seg 04X off 04X n p seg off 2020 1 25 20 五 与地址操作有关的几个函数 4 peekb和peek功能 从给定的地址读取一个字节或一个字原型 charpeekb unsignedseg unsignedoff intpeek unsignedseg unsignedoff 例如 charc s hello c peekb DS s printf c n c 输出结果是 h 2020 1 25 21 五 与地址操作有关的几个函数 5 pokeb和poke功能 向指定的位置写一个字节或一个字原型 voidpokeb unsignedseg unsignedoff charvalue voidpoke unsignedseg unsignedoff intvalue 例如 chars 10 inta 0 x0041 poke DS s a printf s n s 输出结果是 A 2020 1 25 22 第三节TC的编译模式 微模式 Tiny 小模式 Small 中模式 Medium 紧凑模式 Compact 大模式 Large 巨模式 Huge 2020 1 25 23 问题 若要使寄存器AX存储3 C中应如何表达 实地址模式如何寻址 常用的段寄存器有哪些 分别存储什么 什么是近程指针 远程指针 如何定义 使用时注意什么 如何从一个远程指针分离出段地址和偏移地址 如何由段地址和偏移地址得到一个远程指针 TC的编译模式有哪些 适用于什么情况
展开阅读全文
相关资源
相关搜索

当前位置:首页 > 图纸专区 > 课件教案


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!