首页 > 其他分享 >6.3 将数据,代码,栈放入不同的段

6.3 将数据,代码,栈放入不同的段

时间:2023-07-09 11:55:04浏览次数:46  
标签:assume 代码 mov ds 6.3 ax stack data 放入

6.3 将数据,代码,栈放入不同的段

  1. 注意, 当数据,代码,栈需要的空间超过64kb时(偏移地址的范围),就不能放在一个段内,这是8086模式的限制

  2. 示例程序如下:

    assume cs:code, ds:data, ss:stack
    
    data segment
          dw    0123H, 0456H, 0789H, 0abcH, 0defH, 0fedH, 0cbaH, 0987H
    data ends
    
    stack segment
          dw    0, 0, 0, 0, 0, 0, 0, 0
    stack ends     
    
    code segment
    
    start:      mov ax, stack
                 mov ss, ax
                 mov sp, 16
                 mov ax, data
                 mov ds, ax
                 push ds:[0]
                 push ds:[2]
                 pop ds:[2]
                 pop ds:[0]
                 
                 mov ax, 4c00h
                 int 21h
    code ends
    end start
    
    • 程序中“data”段中的数据“0abch”的地址就是:data:6。

      我们要将它送入bx中,就要用如下的代码:

       mov ax,data
       mov ds,ax
       mov bx,ds:[6]
      

      我们不能用下面的指令:

       mov ds,data     
       mov ax,ds:[6]
      

      其中指令“mov ds,data” 是错误的,因为8086CPU不允许将一个数值直接送入段寄存器中。

      当我看到下面这段代码

       mov ax,data
       mov ds,ax
       mov bx,ds:[6]
      

      我有一个疑问,就是assume cs:code, ds:data, ss:stack 不是已经将data和ds绑定了吗,何必再一次赋值呢?(可参考(73条消息) 汇编语言——assume的作用_汇编assume_手写的从前66的博客-CSDN博客

      • 首先要明白的是 assume 是伪代码,无法翻译成机器语言,只有由编译器运行。因此 data 是无法赋值给 ds 的,因为不存在这样一条命令。

      • 换句话说,编写程序,是写给编译软件的。由编译软件,编译成机器码,再去控制CPU。但是,编译软件,对assume语句,并不生成机器码。所以,必须有mov ax,data,mov ds,ax,CPU才能受控。assume语句,是伪指令,仅仅是写给编译软件的。编译软件,并不把它生成机器码。

      • 个人理解,可以把 data 看作 java 中的运行时才确定的变量,只是一种声明的段名,实际运行时才确定真正的值,其含义只是一种规范,给程序员看以知道各个段的含义。

      • assume对除了CS以外的其它段寄存器,仅仅只是关联了段名,以便在访问段内变量时程序可以知道用哪个段寄存器,并没有在程序加载时将段地址装入段寄存器。所以,将段地址装入段寄存器的工作,必须由用户在程序中自己编写代码,并在程序开始运行时执行代码完成装入工作。
        仅仅对CS段寄存器,会在关联段名的同时,在程序加载时自动将段地址装入段寄存器。

      • 作用:用于标识默认段前缀

        解释:assume 并不能改变ds等段寄存器的值,但他能改变编译器产生的汇编代码。比如:

        assume ss:stack
        
        stack segment
        
        x :db 0
        
        stack ends
        
        

        如果程序需要mov ax,[x],那么程序如何定位[x]呢?我们知道x只是一个偏移地址0,所以此时assume就相当于告诉编译器stack段的所有标号都与ss相关联,所以此时[x]就相当于ss:[0]。如果我们直接将这句改为mov ax,ss:[0],那么前面不加assume也是可以的。这也是为什么[0]被编译器强制理解为立即数,而[标号]却被理解为标号里的内容的原因,因为标号必须与段assume,否则会报错cannot address with segment register。而[0]无默认段,就只能被认为为立即数了。

标签:assume,代码,mov,ds,6.3,ax,stack,data,放入
From: https://www.cnblogs.com/alphadoiy/p/17538519.html

相关文章

  • Java版归并排序 演示代码(带注释)
    Code:importjava.util.Arrays;/***归并排序*/publicclassMergeSort{/***私有化*/privateMergeSort(){}/***归并排序的sort方法*@paramarr待排序数组*@param<E>可比较的元素*/publicstatic<Eex......
  • vscode makedown md代码片段不生效
    1.创建markdoen代码片段文件。注意文件名:markdown.json2.写代码片段:"多行注释":{ "prefix":"notebash", "body":[ "", "```bash", "", "```", "" ], "description":......
  • 高级编程技巧揭秘!精通Python装饰器,打造灵活强大的代码结构!
    装饰器是Python中一种强大而灵活的编程技巧,它可以用于修改或扩展函数的行为,同时又不需要修改函数的源代码。本文将介绍Python中的装饰器的基本概念、使用方法以及高级技巧,帮助你从入门到精通装饰器的使用。一、基本概念在深入学习装饰器之前,我们首先需要了解一些基本概念。1.1......
  • 【git】代码patch包生成和合入
    patch合入gitamgitam会直接将patch的所有信息打上去,而且不用重新gitadd和gitcommit,author也是patch的author而不是打patch的人常用命令gitam0001-limit-log-function.patch#将名字为0001-limit-log-function.patch的patch打上gitam--signoff0001-limit-......
  • 卡尔曼滤波器:用R语言中的KFAS建模时间序列|附代码数据
    原文链接:http://tecdat.cn/?p=6762最近我们被客户要求撰写关于卡尔曼滤波器的研究报告,包括一些图形和统计输出。时间序列预测,ARIMA等传统模型通常是一种流行的选择虽然这些模型可以证明具有高度的准确性,但它们有一个主要缺点-它们通常不会解释“冲击”或时间序列的突然变化。......
  • R语言风险价值:ARIMA,GARCH,Delta-normal法滚动估计VaR(Value at Risk)和回测分析股票数据|
    全文链接:http://tecdat.cn/?p=24492最近我们被客户要求撰写关于风险价值的研究报告,包括一些图形和统计输出。此分析的目的是构建一个过程,以在给定时变波动性的情况下正确估计风险价值。风险价值被广泛用于衡量金融机构的市场风险。我们的时间序列数据包括1258天的股票收益介......
  • R语言时间序列TAR阈值自回归模型|附代码数据
    原文链接:http://tecdat.cn/?p=5231最近我们被客户要求撰写关于时间序列TAR阈值自回归的研究报告,包括一些图形和统计输出。为了方便起见,这些模型通常简称为TAR模型这些模型捕获了线性时间序列模型无法捕获的行为,例如周期,幅度相关的频率和跳跃现象。Tong和Lim(1980)使用阈值模型表......
  • 【项目实战功能】自定义注解实现代码的执行耗时记录
    博主介绍:✌博主从事应用安全和大数据领域,有8年研发经验,5年面试官经验,Java技术专家,阿里云专家博主,华为云云享专家✌......
  • 别再说代码质量难评估了!SonarQube一键分析代码质量他不香吗?
    无论是架构师还是研发经理,代码质量都是必须要关注的重点。Sonar(没错,是Sonar,不是SonarQube)是一个用于代码质量管理的开源平台,用于管理代码的质量。它通过插件形式可以支持二十几种语言的代码质量检测,通过多个维度的检查了快速定位代码中潜在的或者明显的错误。千里之行始于足下,......
  • 别再说代码质量难评估了!SonarQube一键分析代码质量他不香吗?
    无论是架构师还是研发经理,代码质量都是必须要关注的重点。Sonar(没错,是Sonar,不是SonarQube)是一个用于代码质量管理的开源平台,用于管理代码的质量。它通过插件形式可以支持二十几种语言的代码质量检测,通过多个维度的检查了快速定位代码中潜在的或者明显的错误。千里之行始于足下,今......