包含多个段的程序

文章目录

  • 包含多个段的程序
    • 在代码段中使用数据
    • 在代码段中使用栈
    • 将数据、代码、栈放入不同的段

包含多个段的程序

在代码段中使用数据

考虑这样一个问题,编程计算以下8个数据的和,结果存在ax 寄存器中:0123H,0456H,0789H,0abcH,0defH,0fedH,0cbaH,0987H。

代码:

assume cs:codesg
codesg segmentdw 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987hmov bx,0mov ax,0mov cx,8s: add ax,cs:[bx]add bx,2loop smov ax,4c00hint 21h
codesg ends
end

“dw”的含义是定义字型数据。dw即define word。在这里,我们使用dw定义了8个字型数据(数据之间以逗号分隔),它们所占的内存空间的大小为16个字节。

这8 个数据在代码段的偏移地址为0、2、4、6、8、A、C、E处。

程序中,我们用bx存放加2递增的偏移地址,用循环来进行累加。

在循环开始前,设置(bx)=0,cs:bx指向第一个数据所在的字单元。

每次循环中(bx)=(bx)+2,cs:bx指向下一个数据所在的字单元。

请添加图片描述

查看内存单元地址可得cs:ip指向第一个字单元,此字单元被我们用来存储数据,计算机却误认为这是代码并从此处开始执行。

请添加图片描述

再次查询偏移地址为16的内存空间,这次得到的才是我们真正要执行的代码。

为了解决上述问题,我们可以给代码段添加一个开始标识符

assume cs:codesg
codesg segmentdw 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987hstart: mov bx,0mov ax,0mov cx,8s: add ax,cs:[bx]add bx,2loop smov ax,4c00hint 21h
codesg ends
end start

再次调式可得程序会从偏移地址为16的位置开始执行代码。

在代码段中使用栈

我们可以在程序中通过定义数据来取得一段空间,然后将这段空间当作栈空间来用。

代码示例:利用栈,将程序中定义的数据逆序存放

assume cs: codesg
codesg segmentdw 0123h,0456h,0789h,0abch,0defh, 0fedh,0cbah,0987hdw 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0;用dw定义16个字型数据,在程序加载后,将取得16 个字的;内存空间,存放这16个数据。在后面的程序中将这段;空间当作栈来使用
start:  mov ax,cs mov ss,ax mov sp,30h   ;将设置栈顶ss:sp指向cs:30mov bx,0mov cx,8s:		push cs:[bx]add bx,2loop s		;以上将代码段0~15单元中的8个字型数据依次入栈mov bx,0mov cx,8
s0: 	pop cs:[bx]add bx,21oop s0		;以上依次出栈8个字型数据到代码段0~15单元中mov ax, 4c00hint 21h
codesg ends
end start

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

我们在程序中用到了数据和栈,我们将数据、栈和代码都放到了一个段里面。我们在编程的时候要注意何处是数据,何处是栈,何处是代码。

这样做显然有两个问题:

  • 把它们放到一个段中使程序显得混乱。
  • 前面程序中处理的数据很少,用到的栈空间也小,加上没有多长的代码,放到一个段里面没有问题。但如果数据、栈和代码需要的空间超过64KB,就不能放在一个段中(一个段的容量不能大于64 KB,是我们在学习中所用的8086模式的限制,并不是所有的处理器都这样)。

所以,我们应该考虑用多个段来存放数据、代码和栈。

我们用和定义代码段一样的方法来定义多个段,然后在这些段里面定义需要的数据,或通过定义数据来取得栈空间。

代码示例

assume cs:code, ds:data,ss:stackdata segmentdw 0123h, 0456h, 0789h, 0abch,0defh,0fedh,0cbah,0987h
data endsstack segmentdw 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
stack endscode segmentstart:  mov ax,stackmov ss,axmov sp,20h		;设置栈顶ss:sp指向 stack:20mov ax,datamov ds,ax		;ds指向data段mov bx,0		;ds:bx指向data段中的第一个单元mov cx,8 s:      push [bx]add bx, 2 loop s		;以上将data段中的0~15单元中的8个字型数据依次入栈mov bx,0mov cx,8 s0:		pop [bx]add bx,2loop s0		;以上依次出栈8个字型数据到data段的0~15单元中mov ax,4c00hint 21h
code ends
end start

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/768813.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

自动驾驶技术中大模型的应用与挑战分析

自动驾驶技术中大模型的应用与挑战分析 1. 背景介绍 自动驾驶技术是近年来人工智能领域的研究热点,它通过计算机视觉、传感器融合、决策规划等技术的综合应用,实现车辆的自主驾驶。随着深度学习技术的快速发展,大模型在自动驾驶领域得到了广…

电机无感算法采集电流的作用

电机无感算法中采集电流的作用是通过测量电机终端的电流,从中获得电机的状态信息,进而实现对电机旋转位置的估算。 采集电流的作用有以下几个方面: 电机模型建立:通过测量电流,可以获得电机的输入量和输出量之间的关系…

ctfshow web入门 反序列化

254 分析代码: 如果用户名和密码参数都存在,脚本会创建一个 ctfShowUser 类的实例 $user。 接着,调用 $user->login($username, $password) 方法尝试登录。如果登录成功(即用户名和密码与类中的默认值匹配)&#…

甲方信息安全建设经验

网络系统安全建设 安全域划分 内部网络系统:主要指OA办公网内部、生产网内部、测试开发网内部、以及其他内部网络系统。 外部网络系统:主要指OA办公网互联网边界、生产网互联网边界、测试开发网互联网边界、互联网上相关所属的网络系统(不…

地图爬虫工具 百度高德腾讯地图商家电话采集软件使用指南

使用地图爬虫工具可以方便地从百度、高德、腾讯地图等地图服务中获取商家的电话号码。下面是使用指南,并附带代码示例。 使用地图爬虫工具之前,我们需要安装相关的依赖库。建议使用Python作为开发语言,因为Python有一些非常好用的爬虫库可供…

详解机器学习概念、算法

目录 前言 一、常见的机器学习算法 二、监督学习和非监督学习 三、常见的机器学习概念解释 四、深度学习与机器学习的区别 基于Python 和 TensorFlow 深度学习框架实现简单的多层感知机(MLP)神经网络的示例代码: 欢迎三连哦! 前言…

Spark Map 和 FlatMap 的比较

Spark Map 和 FlatMap 的比较 本节将介绍Spark中map(func)和flatMap(func)两个函数的区别和基本使用。 函数原型 map(func) 将原数据的每个元素传给函数func进行格式化,返回一个新的分布式数据集。 flatMap(func) 跟map(func)类似,但是每个输入项和…

JUC(二)

1、wait notify Owner 线程发现条件不满足,调用 wait 方法,即可进入 WaitSet 变为 WAITING 状态 BLOCKED 和 WAITING 的线程都处于阻塞状态,不占用 CPU 时间片 BLOCKED 线程会在 Owner 线程释放锁时唤醒 WAITING 线程会在 Owner 线程调用 …

Gelato Network的创始人HILMAR ORTH确认出席HackSummit2024区块链开发者大会

随着Web3技术的日新月异,区块链领域正以前所未有的速度席卷全球。在这一变革的浪潮中,备受瞩目的区块链盛会——Hack.Summit() 2024区块链开发者大会,将于2024年4月9日至10日,在香港数码港隆重登场。这一里程碑式的大会不仅标志着…

#Linux系统编程(read,open,close,write综合练习)

&#xff08;一&#xff09;发行版&#xff1a;Ubuntu16.04.7 &#xff08;二&#xff09;记录&#xff1a; &#xff08;1&#xff09;不传参&#xff0c;指定拷贝文件&#xff0c;指定复制到文件 #include <stdio.h> #include <stdlib.h> #include <sys/typ…

大厂校招,已经在「这些平台」里卷起来了!

如今的校招卷内容&#xff0c;更卷渠道。传统的渠道已然无法满足企业的野心&#xff0c;于是他们将目光投向了主流社交平台。无论是在「微信公众号」、「B站」还是「小红书」&#xff0c;我们都不难发现大厂们「开卷」的身影。那么&#xff0c;参考它们的思路&#xff0c;企业该…

设计模式面试专题

文章目录 请列举出在 JDK 中几个常用的设计模式&#xff1f;什么是设计模式&#xff1f;Java 中什么叫单例设计模式&#xff1f;请用 Java 写出线程安全的单例模式在 Java 中&#xff0c;什么叫观察者设计模式&#xff08;observer design pattern&#xff09;&#xff1f;使用…

富格林:可信要领戒备虚假套路

富格林指出&#xff0c;为避免遭遇虚假套路而造成巨大亏损&#xff0c;投资者需灵活地采用一些可信的交易技巧作为抵抗风险的重要手段。投资者进入市场后&#xff0c;需要的系统学习正规做单技巧&#xff0c;树立正规做单的意识规避虚假套路&#xff0c;提高做单盈利。接下来总…

位运算符与位移运算符

按位与& 两个二进制数字都是1 取1否则取0 按位或I 两个二进制数字都是0取0否则取1 按位取反~如果该位为0则1 &#xff0c;为1取0 按位异或 ^ 相同为零相反为1 移位运算符 有三个: <<, >> ,>>>&#xff0c;都是二元运算符&#xff0c;且都是按…

iPhone 15 Pro LiDAR Module模组逆向(2024.3.23)

iPhone15 Pro出来后,基本上国内所有的模组厂包括舜宇,丘钛等都已经逆向了LiDAR模组,并同时测试了电学,光学,BOM成本等一系列测试。当然市面上最具备影响力的是YOLE的商业评估报告,我这边同时具有这些报告,也有一些自己的见解,当然本篇讲解可能会同时涉及到几个模组厂和…

Python爬虫-批量爬取星巴克全国门店

前言 本文是该专栏的第22篇,后面会持续分享python爬虫干货知识,记得关注。 本文笔者以星巴克为例,通过Python实现批量爬取目标城市的门店数据以及全国的门店数据。 具体的详细思路以及代码实现逻辑,跟着笔者直接往下看正文详细内容。(附带完整代码) 正文 地址:aHR0cHM…

【前端寻宝之路】JavaScript初学之旅

&#x1f308;个人主页: Aileen_0v0 &#x1f525;热门专栏: 华为鸿蒙系统学习|计算机网络|数据结构与算法|MySQL| ​&#x1f4ab;个人格言:“没有罗马,那就自己创造罗马~” #mermaid-svg-azUa9yH16cRXQUxE {font-family:"trebuchet ms",verdana,arial,sans-serif;f…

解读EPO电梯行业数智化平台功能模块,开启电梯行业智能之旅

在当今的电梯行业中&#xff0c;数字化和智能化已经成为提升运营效率和服务质量的关键。EPO电梯行业数智化运营平台凭借其出色的功能模块&#xff0c;为行业带来了创新和变革。那么我们今天就来讲讲国辰智企的EPO电梯行业数智化运营平台的功能吧。 1、EOS土建出图&#xff1a;这…

【STK】手把手教你利用STK进行导弹和反导仿真02 - STK/MMT模块01 导弹任务分析工具概述

导弹任务分析工具 Missile Mission Toolbox MMT包括4个部分,分别是 导弹设计工具 Missile Design Tool MDT 导弹飞行工具 Missile Flight Tool MFT 拦截飞行工具 Interceptor Flight Tool MCT 导弹转换工具 Missile Conversion Tool MCT 可以用于 创建高保真弹道 评估导弹系统…

贝尔曼最优方程【BOE】

强化学习笔记 主要基于b站西湖大学赵世钰老师的【强化学习的数学原理】课程&#xff0c;个人觉得赵老师的课件深入浅出&#xff0c;很适合入门. 第一章 强化学习基本概念 第二章 贝尔曼方程 第三章 贝尔曼最优方程 文章目录 强化学习笔记一、最优策略二、贝尔曼最优方程(BOE)三…