常用的寄存器(& bss段的作用)

论坛 期权论坛     
选择匿名的用户   2021-5-23 10:48   108   0
<div class="content" id="articleContent">
<p><span style="font-size:medium;"> <strong><span style="color:#ff0000;">一个程序本质上都是由 bss段、data段、text段三个组成的</span></strong>。这样的概念,不知道最初来源于哪里的规定,但在当前的计算机程序设计中是很重要的一个基本概念。而且在嵌入式系统的设计中也非常重要,牵涉到嵌入式系统运行时的内存大小分配,存储单元占用空间大小的问题。</span></p>
<p><span style="font-size:medium;">     在采用段式内存管理的架构中(比如intel的80x86系统),<span style="color:#ff0000;"><strong>bss段(Block Started by Symbol segment)</strong></span>通常是指<span style="color:#0000ff;"><strong><span style="color:#0000ff;">用来存放程序中未初始化的全局变量的一块内存区域 </span></strong></span>,一般在<strong><span style="color:#ff0000;">初始化时bss 段部分将会清零</span></strong>。<strong>bss段属于静态内存分配,即程序一开始就将其清零了</strong>。在C语言之类的程序编译完成之后,<span style="color:#0000ff;"><strong>已初始化的全局变量保存在.data 段中,未初始化的全局变量保存在.bss 段中</strong></span> 。<br>    在《Programming ground up》里对.bss的解释为:There is another section called the .bss. This section is like the data section, except that <span style="color:#0000ff;"><strong>it doesn’t take up space in the executable</strong></span>.<br>   <span style="color:#0000ff;"><strong> <span style="color:#ff0000;">text和data段都在<span style="color:#0000ff;">可执行文件</span>中(在嵌入式系统里一般是固化在镜像文件中),由系统从可执行文件中加载;而bss段不在可执行文件中,由系统初始化。</span></strong></span></span></p>
<p><span style="font-size:medium;"> </span></p>
<p><span style="font-size:medium;">寄存器一般分为以下几类</span></p>
<p><span style="font-size:medium;"><strong>4个数据寄存器(EAX、EBX、ECX和EDX)<br>2个变址和指针寄存器(ESI和EDI) 2个指针寄存器(ESP和EBP)<br>6个段寄存器(ES、CS、SS、DS、FS和GS)<br>1个指令指针寄存器(EIP) 1个标志寄存器(EFlags)  </strong></span></p>
<p><span style="font-size:medium;">①数据寄存器</span></p>
<p><span style="font-size:medium;">AX称为<strong>累加器(Accumulator</strong>),<strong>用累加器进行的操作可能需要<span style="color:#0000ff;">更少时间</span></strong>。累加器可用于乘、除、输入/输出等操作,它们的<strong>使用频率很高</strong>;<br>BX称为<strong>基地址寄存器(Base Register)。它可作为<span style="color:#0000ff;">存</span><span style="color:#0000ff;">储器指针</span>来使用;<br></strong>CX称为<strong>计数寄存器(Count Register</strong>)。在循环和字符串操作时,要用它来<strong>控制循环次数</strong>;在位操作中,当移多位时,要用CL来指明移位的位数;<br>DX称为<strong>数据寄存器(Data Register</strong>)。在进行乘、除运算时,它可作为默认的操作数参与运算,也可用于存放I/O的端口地址。</span></p>
<p><br><span style="font-size:medium;">在16位CPU中,AX、BX、CX和DX不能作为基址和变址寄存器来存放存储单元的地址,但在32位CPU中,其<strong>32位寄存器EAX、EBX、ECX和EDX不仅可传送数据、暂存数据保存算术逻辑运算结果</strong>,<strong><span style="color:#ff0000;">而且也可作为指针寄存器,所以,这些32位寄存器更具有通用性。</span></strong></span></p>
<p><span style="font-size:medium;"> </span></p>
<p><span style="font-size:medium;">②变址和指针寄存器(ESI和EDI)  </span></p>
<p><span style="font-size:medium;">寄存器ESI、EDI、SI和DI统称为<strong>变址寄存器(Index Register</strong>),主要用于<strong>存放存储单元在段内的偏移量</strong> , 通过它们可实现多种存储器操作数的寻址方式,为<strong>以不同的地址形式访问存储单元提供方便</strong>。作为通用寄存器,也可存储算术逻辑运算的操作数和运算结果 。<span style="color:#ff0000;"><strong> 它们可作一般的存储器指针使用。在字符串操作指令的执行过程中,对它们有特定的要求,且具有特殊的功能</strong></span></span></p>
<p><span style="font-size:medium;"> </span></p>
<p><span style="font-size:medium;">③指针寄存器(ESP和EBP)  </span></p>
<p><span style="font-size:medium;">32位CPU有2个32位通用寄存器EBP和ESP。<strong>其低16位对应先前CPU中的BP和SP</strong>,低16位数据的存取不影响高16位的数据。</span></p>
<p><span style="font-size:medium;">寄存器EBP、ESP、BP和SP称为指针寄存器(Pointer Register),主要<span style="color:#ff0000;"><strong>用于存放堆栈内存储单元的偏移量,用它们可实现多种存储器操作数的寻址方式,为以不同的地址形式访问存储单元提供方便。 作为通用寄存器,九
分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:3875789
帖子:775174
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP