首页 > 其他分享 >chapter7------栈与寻址

chapter7------栈与寻址

时间:2024-08-03 21:09:31浏览次数:11  
标签:chapter7 sp 栈顶 栈段 地址 寻址 寄存器 ------

栈段

和代码段、数据段一样,栈也被定义为一个内存段,叫做栈段,由段寄存器ss指向

  • 定义栈段

    • 初始化段寄存器ss--->指向栈段的首地址
    • 初始化栈指针sp--->指向栈顶字节(以字为单位移动),初始化时指向栈段最后一个字节的下一字节,其实就等于分配给栈段的字节数
  • 栈操作

    • push:压栈,sp的值减2
    • pop:出栈,sp的值加2
  • 作用

    • 临时存储数据
    • 保护数据,比方说先将寄存器ax的值压入栈中,然后有个函数更改了ax的值,函数结束后再将栈中的值弹出,由ax接受,这样就保护了ax的内容
  • 注意点

    • push/pop指令的操作数是16位寄存器或16为内存单元,一个字的大小
    • 栈本质上只是普通的内存区域,用push/pop指令来访问
    • 保持栈的平衡,出栈与入栈要成对(即push和pop的数目一样)
    • 在编写程序前,充分估计所需要的栈空间,放置破坏有用的数据
    • 将栈定义到一个单独的段中,可以是错误仅局限于栈,sp的内容只会在栈段的地址范围来回滚动,不影响其他内存段
  • bochs调试显示栈的内容

    • print-stack命令用于显示栈顶以下的16个字的内容,第一个地址最低的就是栈顶

栈是由高地址向低地址生长的,即栈顶是低地址

寻址方式

  • 寄存器寻址:指令的操作数位于寄存器中
  • 立即寻址:指令的操作数是一个立即数
  • 内存寻址:实际上就是寻找偏移地址,这称为有效地址,段地址由4个段寄存器提供
    • 直接寻址:操作数是一个偏移地址,而且给出了该偏移地址的具体数值,无需计算(段超越前缀和标号,不涉及计算时也是直接寻址)
    • 基址寻址:在指令的地址部分使用bx或bp寄存器来提供偏移地址
      当我们使用栈时,我们只能访问栈顶元素,若是想不改变sp去访问元素,可以先将sp的值赋给bp,然后在去添加元素等等,这时候就可以通过bp访问栈顶以下的元素而不改变sp了
    • 变址寻址:类似基址寻址,只不过使用的是变址寄存器(si和di)
    • 基址变址寻址:同时使用bx/bp和si/di这两类寄存器

标签:chapter7,sp,栈顶,栈段,地址,寻址,寄存器,------
From: https://www.cnblogs.com/winter-z/p/18341059

相关文章

  • 第五周总结
    异常处理本周,我深入学习了Java的异常处理机制。异常是程序在执行过程中出现的错误或异常情况,Java通过异常处理机制来捕获和处理这些异常,以保证程序的健壮性和稳定性。try-catch语句:我掌握了如何使用try块来标识可能发生异常的代码区域,并通过catch块来捕获并处理这些异常。同时......
  • Docker常用容器安装
    Docker安装安装docker(centos)docker引擎安装官网地址:InstallDockerEngineonCentOS|DockerDocumentation手动安装#卸载旧版本sudoyumremovedocker\docker-client\docker-client-latest\docker-common\docker-latest\docker-latest-logrotate\docker-l......
  • FFmpeg在游戏视频录制中的应用:画质与文件大小的综合比较
    我们游戏内的视频录制目前只支持avi固定码率,在玩家见面会上有玩家反馈希望改善录制画质,我最近在研究了有关视频画质的一些内容并做了一些统计。录制视频大小对比首先在游戏引擎中增加了对录制mp4格式的支持,并且使用h246编码可以直接在网页上播放无法再做转码测试场景:视频尺寸固......
  • 软件工程进度报告——第五周
    经过前几周的学习,本周我尝试练习了一些简单的题目。1.Java的第一个代码2.拼接打印:输出:XXX:这是我学习JAVA的第X年,我的期望薪资是XXX3.定义两个整数,计算这两个整数加减乘除运算的结果,并把结果打印到控制台4.接收用户输入的2个整数,并将它们的最大值作为结果输出......
  • 中缀表达式转前缀表达式
    中缀表达式转前缀表达式:举例:(1+2)/3*41.根据正常的运算顺序,应该先算(1+2),所以这里先改(1+2):括号可以去掉,变成1+2,把1+2看成是xyz形式,‘1’对应x,‘+’对应y,‘2’对应z;然后改成yxz形式,也就是+12。2.随后把(+12)看作一个整体(加上括号便于区分),把原式替换变成(+12)/3*4,继续按上述步骤:......
  • 一文讲清楚synchronized原理---每周一更系列
    synchronized是Java提供的原子性内置锁,这种内置的并且使用者看不到的锁也被称为监视器锁。synchronized通过在代码块前后加上monitorenter和monitorexit字节码指令用于实现进入和退出。如果是同步方法,则是打上标记,隐式的使用monitorenter和monitorexit字节码指令。在jdk1.5之前......
  • Unittest框架的介绍及使用
    介绍基本概念​ unittest是Python自带的一个单元测试框架,它可以做单元测试,也能用于编写和运行重复的测试工作。它给自动化测试用例开发和执行提供了丰富的断言方法,判断测试用例是否通过,并最终生成测试结果.四大组件testcase:就是我们的测试用例,unittest中提供了一个......
  • 8.3学习周记
    一.C语言学习1.数值输出(以整数为例):数值占3位%3d默认为右对齐左对齐要加负号变为%-3d2.字符串相关函数的学习:(数组1指向字符串1,数组2指向字符串2)a.strstr函数:strstr函数搜索字符串1是否在字符串2中出现,若未搜索到,则返回NULL;若搜索到,则该函数返回第一次出现s2的地址。b.strcpy......
  • 从零开始的JAVAday29~day35
    后续语法if()语法若满足()中的语法,则执行后面的语句。循环for(a;b;c)和while(c)语法for(a;c;b)语法意思为在循环前进行a语句每次循环结束后进行b语法,若满足c语句则再次循环。whlie(c)循环若满足c条件则循环。......
  • 【2024暑#108】ACM暑期第三次测验(个人赛)
    A-猫抓老鼠经典的逆序对问题,这里就不过多阐述了有递归和树状数组两种写法,自行百度即可B-字符变换查看\((S[i]-T[i])\%26\)是否相同即可#include<bits/stdc++.h>usingnamespacestd;intmain(){stringS,T;cin>>S>>T;set<int>st;for(inti......