【新书推荐】26.3 模块间的信息传递

模块间的信息传递主要表现为模块间过程调用时的参数传递。在第十一章介绍的过程调用参数传递原则和方法依然有效。少量的参数可以利用寄存器传递或堆栈传递,大量的参数可先组织在一个缓冲区中,然后利用寄存器或堆栈传递相应的指针。

如果利用约定的存储单元传递参数,情形稍微复杂些,需要把它们声明为公共标识符。

本节内容:模块间的信息传递方法。

■利用寄存器和约定存储单元传递信息:即使用全局变量在模块间传递信息,示例代码t26-2.asm。

■利用段覆盖方法在模块间传递信息:通过使用COMMON组合类型覆盖另一个模块段的方法传递信息,示例代码t26-3.asm、t26-3ma.asm。

26.3.1 利用寄存器和约定存储单元传递信息

例5:写一个DOS版本号的程序

动手实验137写一个DOS版本号的程序。演示模块间利用寄存器和约定存储单元传递信息。

在理解下面示例程序的基础上,自己独立编写源程序。编译完成后,在debug调试器中单步跟踪调试,以验证程序的正确性。

示例代码113

;程序名:t26-2.asm

;功能:演示模块间利用寄存器和约定存储单元传递信息

;===============================================================

assume cs:cseg,ds:dseg

dseg segment public 'data'

mess db 'DOS Version is'

mess1 db ?

           db '.'

mess2 db 2 dup(?)

           db 0dh,0ah,'$'

verm  db 0

vern  db 0

dseg ends

         ;声明VERM和VERN是公共标识符

         public verm,vern

         ;声明getver和todasc在其他模块定义

         extrn getver:far,todasc:far

         ;

cseg segment public 'code'

start:

         mov ax,dseg

         mov ds,ax

         ;

         call getver                  ;取得DOS版本号

         ;

         mov al,verm

         mov bx,length mess1       ;返回mess1重复操作符dup前的count值

         mov si,offset mess1

         call todasc                           ;把主版本号转换成可显示形式

         mov al,vern

         mov bx,length mess2

         call todasc                           ;把次版本号转换成可显示形式

         mov dx,offset mess

         mov ah,9

         int 21h

         mov ax,4c00h

         int 21h

cseg ends

         end start

        

;程序名:t26-2ma.asm

;功能:作为程序t26-2.asm的模块

;=========================================================================

assume cs:func

         ;声明GETVER和TODASC为公共标识符

         public getver,todasc

         ;声明VERM和VERN在其他模块定义

         extrn verm:byte,vern:byte

         ;

func segment public 'code'      ;定义代码段

;子程序名:getver

;功能:获取DOS版本号

;入口参数:无

;出口参数:在其他模块的VERM单元中存放主版本号

;在其他模块的VERN单元中存放次版本号

;说明:远过程

getver proc far

         mov ah,30h               ;30h DOS功能调用取版本号

         int 21h

         mov verm,al              ;al=主版本号

         mov vern,ah              ;ah=次版本号

         ret

getver endp

;----------------------------------------------------

;子程序名:todasc

;功能:把一个8位二进制数转换为相应十进制数的ASCII码串

;入口参数:AL=欲转换的二进制数,BX=十进制数的最少位数

;DS:SI=存放ASCII码串的缓冲区首地址

;出口参数:ASCII码串在相应的缓冲区

todasc proc far

         mov cl,10

todasc1:

         xor ah,ah

         div cl

         add ah,30h

         mov [si+bx-1],ah

         dec bx

         jnz todasc1

         ret

todasc endp

func ends

         end

子程序GETVER把DOS的版本号直接填入在主模块中约定的单元VERM和VERN中。子程序TODASC的入口参数由寄存器传递,转换得到的十进制数ASCII码串直接写到主模块的指定缓冲区中。这两个子程序均被定义为远过程。

正确设置数据段或附加段寄存器是模块间正确传递信息的保证。访问定义在其他模块的变量前,必须保证已设置好相应的段寄存器。例如:在调用GETVER之前必须正确设置数据段寄存器DS,因为子程序GETVER在访问约定的变量时,认为数据段寄存器已设置好。如果有必要还可以动态地改变段寄存器内容。

26.3.2 利用段覆盖方法在模块间传递信息

模块间传递信息的另一个方法就是利用段覆盖,这个方法只适用于模块间传递信息。具体方法是:在两个模块中都定义一个同名同类别数据段,规定段组合类型是COMMON;把要传递的数据(变量)安排在这两个数据段的相同位置上。由于这两个在不同模块中的数据段同名同类别,且组合类型是COMMON,所以连接时它们就发生重叠。

例6:写一个显示当前系统日期的程序

动手实验138写一个显示当前系统日期的程序。演示利用段覆盖方法在模块间传递信息。

在理解下面示例程序的基础上,自己独立编写源程序。编译完成后,在debug调试器中单步跟踪调试,以验证程序的正确性。

示例代码114

;例6:写一个显示当前系统日期的程序。

;为了简单化,显示的日期只含月和日。主模块有一个代码段和一个数据段,

;从模块也有一个代码段和数据段。

;程序名:t26-3.asm

;功能:演示利用段覆盖方法在模块间传递信息

;=======================================================

assume cs:cseg,ds:dseg

extrn getdate:far              ;声明getdate在其他模块定义

;

dseg segment common            ;定义一个具有common类型的数据段

mess  db 'Current date is'

mess1 db 2 dup(?)

           db '_'

mess2 db 2 dup(?)

      db 0dh,0ah,24h

dseg ends

;

cseg segment public

start:

         mov ax,dseg

         mov ds,ax

         call getdate      ;调用GETDATE取日期

         mov dx,offset mess

         mov ah,9

         int 21h

         mov ax,4c00h

         int 21h

cseg ends

         end start

;模块名:t26-3ma.asm

;功能:作为t26-3.asm的一部分

;========================================================

public getdate                           ;声明getdate作为公共标识符

;

dseg segment common            ;定义一个具有COMMON类型的数据段

mess  db 'Current date is:'

mess1 db 2 dup(?)

      db '_'

mess2 db 2 dup(?)

      db 0dh,0ah,24h             ;这部分数据与模块t8-9中完全相同

year  dw ?

month db ?

day   db ?                                  ;这部分变量是另外加上的

dseg ends

;

cseg segment byte public       ;定义代码段

         assume cs:cseg,ds:dseg

;子程序名:getdate

;功能:取得当前日期并把月日数转换成相应的十进制数ASCII码串

;入口参数:无

;出口参数:ASCII码串填入约定缓冲区

;说明:远过程

getdate proc far

         mov ah,2ah                        ;取得当前系统日期

         int 21h

         mov year,cx

         mov month,dh

         mov day,dl

         mov al,month

         mov bx,length mess1       ;把月数转换成十进制数ASCII码串

         mov si,offset mess1

         call todasc

         mov al,day

         mov bx,length mess2       ;把日数转换成十进制数ASCII码串

         mov si,offset mess2

         call todasc

         ret

getdate endp

;----------------------------------------------------

;子程序名:todasc

;功能:把一个8位二进制数转换为相应十进制数的ASCII码串

;入口参数:AL=欲转换的二进制数,BX=十进制数的最少位数

;DS:SI=存放ASCII码串的缓冲区首地址

;出口参数:ASCII码串在相应的缓冲区

todasc proc near

         mov cl,10

todasc1:

         xor ah,ah

         div cl

         add ah,30h

         mov [si+bx-1],ah

         dec bx

         jnz todasc1

         ret

todasc endp

cseg ends

         end

模块t26-3ma中的数据段比模块t26-3.asm中的数据段多了若干变量,在段覆盖时,以最长的段为段的最后实际长度。但必须注意,要传递的数据变量必须安排在相同的位置。由于模块t26-3ma中含有要访问的数据段,所以过程getdate能够随便地访问想要访问的对象。

练习

1、请简述汇编语言程序设计时,模块间的通信方法及其具体实现的过程。

本文摘自编程达人系列教材《X86汇编语言基础教程》。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

ES分片均衡策略分析与改进

从故障说起 某日早高峰收到 Elasticsearch 大量查询超时告警,不同于以往,查看 Elasticsearch 查询队列监控后发现,仅123节点存在大量查询请求堆积。 各节点查询队列堆积情况 查看节点监控发现,123节点的 IO 占用远高于其他节点。…

CcFrame Logo完成

Compact celerity framework CCFrame:一个快速开发、精简压缩的SAAS微服务后端架构 仅需要一台阿里云2核2G机器即可完整运行平台系统及其所有的运行及数据支持 微服务、远程-本地二级缓存架构、ES索引、队列、分库分表、集群定时器,一个都不能少 谁说2…

基于YOLOv8深度学习的木薯病害智能诊断与防治系统【python源码+Pyqt5界面+数据集+训练代码】深度学习实战

《博主简介》 小伙伴们好,我是阿旭。专注于人工智能、AIGC、python、计算机视觉相关分享研究。 ✌更多学习资源,可关注公-仲-hao:【阿旭算法与机器学习】,共同学习交流~ 👍感谢小伙伴们点赞、关注! 《------往期经典推…

【R语言实战】——fGARCH包在金融时序上的模拟应用

🍉CSDN小墨&晓末:https://blog.csdn.net/jd1813346972 个人介绍: 研一|统计学|干货分享          擅长Python、Matlab、R等主流编程软件          累计十余项国家级比赛奖项,参与研究经费10w、40w级横向 文…

【惠友小课堂】健康开学第一课,青少年脊柱侧弯了解一下?让孩子少走“弯”路

寒假结束迎来开学,家长们又开始了新一轮的“内卷”之旅,可在关心学业的同时,千万不能忽略孩子们的身体健康,脊柱侧弯已成为继肥胖症、近视之后我国儿童青少年的第三大健康“杀手”。 至于引起脊柱侧弯的原因,可能很多家…

安装Android Studio遇到Unable to access Android SDK add-on list的错误

第一次安装android studio的时候,提示:unable to access Android sdk add-on list 解决办法 这个错误一般是android studoi代理没有设置导致的,需要在setting里面设置: 点击Android Studio - Preferences,在 Appeara…

【Java设计模式】十八、观察者模式

文章目录 1、观察者模式2、案例:模拟微信公众号3、总结4、在源码中的实际应用 1、观察者模式 发布订阅模式,一对多,让多个观察者对象同时监听某一个主题对象。主题对象状态发生变化时,通知所有的观察者对象,让它们自动…

SpringBoot功能模块之实现单文件、多文件上传和下载

一、单文件上传 1.1MultipartFile MultipartFile 是 Spring 框架中的一个接口,主要用于处理 HTTP 请求中的文件上传。它提供了一些方法来获取上传文件的信息和内容。 以下是 MultipartFile 的一些主要方法: getOriginalFilename():返回上…

vue 实现滚动导航

效果 实现 css 使用了 unocss 使界面滚动到给定元素的指定坐标位置 window.scrollTo({ top: 0 })使用了内边距避免最后数据高度不够 <main class"pb-100vh"></main>完整代码 <script lang"ts" setup> defineOptions({ name: DemoVi…

掌握Go语言:深入encoding/gob包的高效数据序列化

掌握Go语言&#xff1a;深入encoding/gob包的高效数据序列化 引言理解Gob和它的使用场景Gob的概念和设计目标Gob的适用场景和优势 开始使用Gob基本的Gob编码和解码示例代码编码&#xff08;序列化&#xff09;解码&#xff08;反序列化&#xff09; Gob编码高级应用自定义类型的…

Minecraft 1.20.1 Forge服务器保姆级搭建教程 (使用mcsm面板 | 两种启动方式)

MC Forge 服务器部署 使用 Linux 云服务器部署 Minecraft 1.20.1 Forge 服务器 目录 MC Forge 服务器部署看这篇教程之前&#xff0c;你需要准备好这篇教程的目标前期准备1. 环境需求&#xff1a;腾讯云、CentOS 7.9&#xff08;对于其他云服务商和 Linux 系统&#xff0c;操作…

[vscode]使用cmake时将命令行参数传递给调试目标

一、简介 本文介绍了在vscode中使用cmake工具时&#xff0c;如何传递参数给编译目标的方法。 前提&#xff1a;使用vscodecmake编译C/C程序。 二、方法 在.vscode/目录下新建settings.json文件&#xff0c;并将待传底的参数写在 cmake.debugConfig里。 下面介绍了一个示例&a…

重磅!2014-2023七大顶刊中国学者排行榜出炉,施一公、颜宁位列前二

在科学领域&#xff0c;Cell、Nature和Science被公认为最顶尖的期刊&#xff0c;简称CNS。而在医学方面&#xff0c;新英格兰医学杂志(NEJM)、柳叶刀(Lancet)、美国医学会杂志(JAMA)以及英国医学期刊(BMJ)被誉为“四大医学顶刊”。这七大期刊上发表的论文&#xff0c;往往被看作…

平台工程:构建企业数字化转型的基石

有人说&#xff0c;平台工程&#xff08;Platform Engineering&#xff09;&#xff0c;不过是新瓶装旧酒&#xff08;DevOps&#xff09;。 而Gartner 将平台工程列为 2024 顶级战略技术趋势之一。我国信通院也开始陆续制定与平台工程相关的技术标准。 随着数字化浪潮的席卷…

2024年软考计划开始了,你准备好了吗?

目录标题 2024年度计算机技术与软件专业技术资格&#xff08;水平&#xff09;考试工作计划计算机软考中级科目哪个含金量最高&#xff1f;报考流程和说明 2024年度计算机技术与软件专业技术资格&#xff08;水平&#xff09;考试工作计划 一、2024年度计算机软件资格考试(初级…

数学建模-多目标规划算法(美赛建模)

单目标优化的情况下&#xff0c;只有一个目标&#xff0c;任何两解都可以依据单一目标比较其好坏&#xff0c;可以得出没有争议的最优解。 多目标化与传统的单目标优化相对。多目标优化的概念是在某个情景中在需要达到多个目标时&#xff0c;由于容易存在目标间的内在冲突&…

MO干货 | shuffle执行计划解析(下篇)

作者&#xff1a;倪涛 MO产品布道师 目录 Part 1.如何处理不均匀数据&#xff1f; Part 2.Hybrid shuffle Part 3.Shuffle resue Part 4.Join reorder Part 5.总结 在《MO干货&#xff5c;shuffle执行计划解析&#xff08;上篇&#xff09;》中&#xff0c;我们分享了shu…

选课模块-01添加免费/收费选课

添加选课 界面原型 第一步&#xff1a;用户通过搜索课程、课程推荐等信息进入课程详情页面&#xff0c;点击马上学习进行学习 第二步&#xff1a;课程免费时可以直接加入我的课程表并且免费课程可以直接在线学习&#xff0c;免费课程默认一年有效期&#xff0c;到期需要申请续…

148个Chatgpt关键词汇总-有爱AI实战教程(二)

演示站点&#xff1a; https://ai.uaai.cn 技能模块 官方论坛&#xff1a; www.jingyuai.com 京娱AI 导读&#xff1a;在使用 ChatGPT 时&#xff0c;当你给的指令越精确&#xff0c;它的回答会越到位&#xff0c;举例来说&#xff0c;假如你要请它帮忙写文案&#xff0c;如…

C语言经典算法学习-4

文章目录 21.最大访客数22.中序式转后序式&#xff08;前序式&#xff09;23.后序式的运算24.洗扑克牌&#xff08;乱数排列&#xff09;25.Craps赌博游戏 21.最大访客数 说明&#xff1a;现将举行一个餐会&#xff0c;让访客事先填写到达时间与离开时间&#xff0c;为了掌握座…