当前位置: 首页 > news >正文

汇编原理(二)寄存器——内存访问

一个字 = 两个字节

双字

字节为8位

字为16位(看两格)

双子dword32位(看四格)

内存中字的存储:

        0地址单元中存放的字节型数据是多少?

        0地址字单元中存放的字型数据是多少?

        2地址字单元中存放的字节型数据是多少?

        2地址单元中存放的字型数据是多少(0012。字型要考虑两个字节)

        1地址字单元中存放的字型数据是多少(124E)(单元和字单元有什么区别?

        任何两个地址连续的内存单元,N号单元和N+1号单元,可以将他们看成两个内存单元,也可以看成一个地址为N的字节单元中的高位字节单元和低位字节单元

DS和 [ address ]:回过头来看,这两个玩意一定是成对出现的,才能唯一确定一个物理地址

        DS(data)寄存器用来存放要访问的数据的段地址

        mov功能:1.(1)将数据直接送入寄存器(2)将一个寄存器中的内容送入另一个寄存器。                                      除此之外,mov还可以将一个内存单元中的内容送入一个寄存器

        对上面指令的解释:

                1.先说明:[ ... ]中存放偏移地址,DS中存放段地址

                2.10000H表示1000:0(段地址:偏移地址)(为什么能唯一确定只能是这个比值?

                3.将段地址1000H放入ds

                4.用mov al,[0]完成传送( [  ] 中只用说明偏移地址,段地址默认放在ds中)

        那能否直接mov ds, 1000H?这样写指令合法吗?

                不行,不能将数据直接送入段寄存去,数据只能送入通用寄存器(硬件设计问题)

                数据 -> 通用寄存器 -> 段寄存器 (间接)

        这样就完成了将内存单元中的数据送入寄存器。

  那如何将数据送入内存单元?
             

                放到一起对比一下

        

        有例题:配置好环境后需要自己实现

mov、add、sub指令:

        推测:mov 寄存器,段寄存器 也是正确的

        add和sub同理:

数据段:         

        在内存和寄存器之间传送字型数据时,高地址单元和高8位寄存器、低地址单元和低8位寄存器相对应

栈(Fist In Last Out):

push和pop:入栈和出栈都是以字为单位

        push ax : 将寄存器ax中的数据送入栈中;

        pop ax : 从栈顶取出数据送入ax

cpu怎么知道一段内存空间被当作栈使用?如何知道那个单元时栈顶?

        第一个问题:

                有两个寄存器:S(stack)S(段寄存器:记录栈顶段地址)和SP(记录栈顶偏移地址)

                SS:SP就指向栈顶单元        

                任何一个时刻SS:SP指向栈顶(容易搞混)

        第二个问题:

                push ax.      该指令发生后,会(自动)进行SP = SP - 2;所以SS:SP将会指向新的栈顶

push的过程:

pop的过程:

        pop之后只会使SS:SP移动,但内存单元中的数据不会删除,下次在push会对它进行覆盖(删不干净)

                       

栈顶越界的问题:(溢出攻击)

栈和内存:栈就是内存空间的一部分

push和pop指令:

         比如段地址现在指向1000,那就将这个16进制数放入SS:SP所指向的位置      

        栈操作都是以字为单位

  

模拟函数调用过程:

注意因为bx后入栈,所以一定要先出栈 ,对顺序是有要求的

交换两数的值:

                对pop ax理解应该是:弹出最后一个值,将其赋值给ax

        执行push和pop指令与mov指令不同,mov执行传送指令只需要一步操作,而执行push和pop指令却需要两部操作:执行push时:先改变SP,后向SS:SP处传送;执行pop时,先读取SS:SP处的数据,后改变SP。

栈段:

一个栈段最大可以设为多少?2的16次方

         对于数据段,将段地址放在DS中,对于代码段,段地址放在CS中,对于栈段,将段地址放在SS中

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 掌握SQL注入检测:深入理解SQLMAP工具
  • 成长之路Flutter中的TextField组件
  • 数据中台建设方案(Word版源文档)
  • CentOS8搭载正反向解析dns服务器
  • 2020职称继续教育--突发公共卫生事件应急处理技术方案
  • PHP框架 Laravel
  • 「小明赠书活动」第四期《Java开发坑点解析:从根因分析到最佳实践》
  • 数据结构与算法之线性表01
  • C语言一个头⽂件可以包含另⼀个头⽂件吗?
  • Facebook开户 | Facebook的CTR是什么?
  • RK平台ADB不识别问题排查
  • 免费wordpress中文主题
  • python连接FTP服务器:[WinError 10054] 远程主机强迫关闭了一个现有连接
  • 金融信创生态实验室第三期金融信创优秀解决方案--中间件统一管理平台解决方案
  • 基于FMEA保证汽车电控系统的可靠性
  • angular2开源库收集
  • Docker: 容器互访的三种方式
  • eclipse的离线汉化
  • ECMAScript 6 学习之路 ( 四 ) String 字符串扩展
  • HTML5新特性总结
  • Magento 1.x 中文订单打印乱码
  • passportjs 源码分析
  • PV统计优化设计
  • Python语法速览与机器学习开发环境搭建
  • text-decoration与color属性
  • vue从创建到完整的饿了么(18)购物车详细信息的展示与删除
  • 由插件封装引出的一丢丢思考
  • - 语言经验 - 《c++的高性能内存管理库tcmalloc和jemalloc》
  • linux 淘宝开源监控工具tsar
  • mysql 慢查询分析工具:pt-query-digest 在mac 上的安装使用 ...
  • 第二十章:异步和文件I/O.(二十三)
  • ​​​​​​​ubuntu16.04 fastreid训练过程
  • ​软考-高级-信息系统项目管理师教程 第四版【第19章-配置与变更管理-思维导图】​
  • !!【OpenCV学习】计算两幅图像的重叠区域
  • !!Dom4j 学习笔记
  • $().each和$.each的区别
  • ( )的作用是将计算机中的信息传送给用户,计算机应用基础 吉大15春学期《计算机应用基础》在线作业二及答案...
  • (Charles)如何抓取手机http的报文
  • (分享)自己整理的一些简单awk实用语句
  • (附源码)计算机毕业设计SSM智能化管理的仓库管理
  • . Flume面试题
  • .mysql secret在哪_MYSQL基本操作(上)
  • .Net Core/.Net6/.Net8 ,启动配置/Program.cs 配置
  • .NET Core日志内容详解,详解不同日志级别的区别和有关日志记录的实用工具和第三方库详解与示例
  • .net dataexcel winform控件 更新 日志
  • .Net mvc总结
  • .NET 药厂业务系统 CPU爆高分析
  • .NET/C# 反射的的性能数据,以及高性能开发建议(反射获取 Attribute 和反射调用方法)
  • .NET/C# 解压 Zip 文件时出现异常:System.IO.InvalidDataException: 找不到中央目录结尾记录。
  • .NET/C# 使用 SpanT 为字符串处理提升性能
  • .Net高阶异常处理第二篇~~ dump进阶之MiniDumpWriter
  • .NET开源项目介绍及资源推荐:数据持久层
  • .net流程开发平台的一些难点(1)
  • .NET企业级应用架构设计系列之结尾篇
  • @angular/cli项目构建--http(2)