汇编语言:寻址方式在结构化数据访问中的应用——计算人均收入

有一年多没有在CSDN上发博文了。人的工作重心总是有转移的,庆幸一直在做着有意义的事。
  今天的内容,是为汇编语言课程更新一个实验项目。
  
  本方案修改自王爽编《汇编语言》第4版P172“实验7寻址方式在结构化数据访问中的应用”

【数据描述】

烟园科技公司从2004年成立一直到2023年的基本情况如下。

年份总收入(万元)雇员(人)人均收入(万元)
2004227?
20053829?
2006135613?
2007239028?
2008800038?
……
2023593700017800?

下面的程序中,已经定义好了这些数据:

assume cs:codesg
data segmentdb '2004','2005','2006','2007','2008','2009','2010','2011','2012','2013'db '2014','2015','2016','2017','2018','2019','2020','2021','2022','2023';以上是表示20年的20个字符串dd 22,382,1356,2390,8000,16000,24486,50065,97479,140417dd 197514,345980,590827,803530,1183000,1843000dd 2759000,3753000,4649000,5937000;以上是表示20年公司总收入的20个dword型数据dw 7,9,13,28,38,130,220,476,778,1001,1442,2258,2793,4037,5635,8226dw 11542,14430,15257,17800;以上是表示20年公司雇员人数的20个word型数据
data ends
table segmentdb 20 dup('year summ ne ??')
table ends`

【任务】

请编程序,将data段中的数据按如下格式整理到table段中,并计算20年中的人均收入(取整),记录到table段的相应位置上。
  在table段中,一年的数据占16个字节,各字节分配如下表所示。
在这里插入图片描述
说明:与教材中提供的方案相比,每一部分的偏移地址为偶数,是更有效率的解决方案,而预留“保留”空间,既能让每一条记录所点空间保持16的倍数上(这是一个很好的特征),也为系统未来扩充等提供方便。

【提示】

①要做的工作主要是将data段中的数据复制到table段中,类似将数据做一个“扭转”;
②可将data段中的数据看成是多个数组,用DS指标该数据段,而将table中的数据看成是一个结构型数据的数组,每个结构型数据中包含多个数据项,用ES指示该数据段;
③寻址方式建议:可用bx定位每个结构型数据,用idata定位数据项,用si定位数组项中的每个元素,对于table中的数据的访问可采用[bx].idata和[bx].idata[si]的寻址方式;
④程序结构方面:可以将程序分为四块,分别用四个循环处理——复制年份、复制总收入、复制雇员数、计算人均收入,当然,这四个循环可以合并以提高效率。

【参考解答】

assume cs:codesg, ds:data
data segmentdb '2004','2005','2006','2007','2008','2009','2010','2011','2012','2013'db '2014','2015','2016','2017','2018','2019','2020','2021','2022','2023';以上是表示20年的20个字符串dd 22,382,1356,2390,8000,16000,24486,50065,97479,140417dd 197514,345980,590827,803530,1183000,1843000dd 2759000,3753000,4649000,5937000;以上是表示20年公司总收入的20个dword型数据dw 7,9,13,28,38,130,220,476,778,1001,1442,2258,2793,4037,5635,8226dw 11542,14430,15257,17800;以上是表示20年公司雇员人数的20个word型数据
data endstable segmentdb 20 dup('YearSummNeAv????')
table ends;定义代码段
codesg segment
start: mov ax, datamov ds, axmov ax, tablemov es, ax;复制年份mov cx, 20mov si, 0   ;data段的数据项mov bx, 0   ;table段年份的起始偏移地址
s1:mov ax, [si]      ;取data段中年份的前两字节mov es:[bx], ax   ;向table中复制年份的前两字节mov ax,[si+2]     ;取data段中年份的后两字节mov es:[bx+2], ax ;向table中复制年份的后两字节add si, 4         ;指向data段的下一个数据项add bx, 16        ;指向table中下一年的位置loop s1;复制总收入mov cx, 20mov si, 0   ;data段的数据项mov bx, 4   ;table段总收入的起始偏移地址
s2:mov ax, [si+80]      ;取data段中总收入的前两字节mov es:[bx], ax      ;向table中复制总收入的前两字节mov ax,[si+82]       ;取data段中总收入的后两字节mov es:[bx+2], ax    ;向table中复制总收入的后两字节add si, 4            ;指向data段的下一个数据项add bx, 16           ;指向table中下一年的位置loop s2;复制雇员人数mov cx, 20mov si, 0   ;data段的数据项mov bx, 8   ;table段雇员人数的起始偏移地址
s3:mov ax, [si+160]     ;取data段中雇员人数mov es:[bx], ax      ;向table中复制雇员人数的前两字节add si, 2            ;指向data段的下一个数据项add bx, 16           ;指向table中下一年的位置loop s3;计算人均收入mov cx, 20mov bx, 0   ;table段雇起始偏移地址
s4:mov ax, es:[bx+4]      ;取总收入低16位mov dx, es:[bx+6]      ;取总收入高16位div word ptr es:[bx+8] ;除以雇员数,完成除法,商存放在AX中mov es:[bx+10], ax     ;存储人均收入add bx, 16             ;指向table中下一年的位置loop s4mov ax,4c00hint 21h
codesg ends
end start

下面是程序运行后看到的一部分数据:
在这里插入图片描述

【进一步改进】

参考解答中使用了并行的4个循环。观察到循环中寻址方式一致,将循环适当合并,是可能且会获得效率上提升的。
  用这个结构试着通思路,再改进出更高效率的解决方案,值得同学们一试。

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

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

相关文章

C 练习实例98-汉诺塔(完结撒花)

递归 #include <stdio.h> int sumN(int n) {if( n 1 )return 1;elsereturn sumN(n-1)n; } int main() {printf("数列n的前%d项和为: %d",100,sumN(100));return 0; } 数列n的前100项和为: 5050 汉诺塔 人为分析 A B C 3个柱子 当只…

探索未来游戏:生成式人工智能AI如何重塑你的游戏世界?

生成式人工智能&#xff08;Generative AI&#xff09;正以前所未有的速度改变着各行各业的运作模式。其中&#xff0c;游戏产业作为科技应用的前沿阵地&#xff0c;正经历着前所未有的变革。本文将探讨生成式人工智能如何重塑游戏产业&#xff0c;以及这一变革背后的深远影响。…

一、Docker部署GitLab(详细步骤)

Docker部署GitLab&#xff08;详细步骤&#xff09; 一、拉取镜像二、启动容器三、修改配置四、修改密码五、浏览器访问 一、拉取镜像 docker安装教程&#xff1a;https://qingsi.blog.csdn.net/article/details/131270071 docker pull gitlab/gitlab-ce:latest二、启动容器 …

MySQL-相关数据类型

MySQL-数据类型 整数类型 整数类型包含以下五种&#xff1a; 整数类型字节说明tinyint1一般用于枚举数据&#xff0c;比如系统设定取值范围很小且固定的场景。smallint2可以用于较小范围的统计数据&#xff0c;比如统计工厂的固定资产库存数量等。mediumint3用于较大整数的计…

邮件服务器:Postfix

文章目录 邮件服务器的功能与工作原理电子邮件的问题Mail server与DNS 之间的关系邮件传输所需要的组件(MTA、MUA、MDA)以及相关协议用户收信时服务器端所提供的相关协议&#xff1a;MRA电子邮件的数据内容 使用Postfix与Dovecot部署邮件系统部署基础的电子邮件系统配置Postfix…

软件工程

开发模型 瀑布模型 用于结构化模型开发 适用需求明确或者二次开发 原型模型 适用需求不明确 演化模型 增量模型 适用需求不明确 先做一块&#xff0c;再做一块&#xff0c;这样不断的对核心功能的审视&#xff0c;降低风险 螺旋模型 由多个模型组合成 适用需求不明…

政校企三方牵手打造新质生产力,共建城市供应链安全检测中心

​4月3日 十堰市经开区政府 x 开源网安 战略合作签约仪式 圆满完成 4月3日&#xff0c;开源网安与十堰市经济技术开发区政府、湖北工业职业技术学院、十堰市经开建投签约仪式在十堰国际会展中心圆满完成。本次签约后&#xff0c;签约方将共建十堰市智能网联汽车网络安全测试…

什么是数据治理?你都了解吗?

在当今数字化时代&#xff0c;数据已成为企业重要的战略资产。有效管理数据对于企业提高运营效率、降低成本、做出更好的决策至关重要。数据治理作为一种重要的管理方法&#xff0c;可以帮助企业确保数据的质量、安全、合规性和有效利用。 一、数据治理的定义与重要性 近日&a…

(南京观海微电子)——TFT驱动原理

TFT液晶显示器件是指在液晶显示器件的每个像素上都连接一个薄膜场效应晶体管。这个场效应管制作在液晶显示器件的玻璃上。每个场效应管独立驱动一个像素&#xff0c;从而可以实现高速度、高亮度、高对比度的显示效果。 TFT液晶显示器件的驱动特性取决于场效应管的工作特性。场效…

Electron 是一个流行的框架

Electron 是一个流行的框架&#xff0c;允许开发者使用 JavaScript, HTML 和 CSS 构建跨平台的桌面应用程序。如果你想将你的 Electron 应用程序打包成一个 APK 文件&#xff08;Android 应用程序包&#xff09;&#xff0c;那么你可能会遇到一些问题&#xff0c;因为 Electron…

SpringBoot实现邮箱验证

目录 1、开启邮箱IMAP/SMTP服务&#xff0c;获取授权码 2、相关代码 1、使用配置Redis&#xff08;用于存储验证码&#xff0c;具有时效性&#xff09; 2、邮箱依赖和hutool&#xff08;用于随机生成验证码&#xff09; 3、配置Redis和邮箱信息 4、开启Redis服务 5、编写发送…

顺序表应用——通讯录实现

目录 前言&#xff1a; 一、开始菜单 二、通讯录代码实现 2.1 通讯录初始化 2.2 增加联系人 2.3 删除联系人 2.4 修改联系人 2.5 通讯录的销毁 三、总代码 最后&#xff1a; 前言&#xff1a; 通讯录实现的基础是基于顺序表的实现&#xff0c;对于顺序表如有疑惑之处可翻…

[XJTU-SY-BD]设计06 处理C/Python 结构体互操作

0.引言 很多时候,会涉及C/Python混合编程,下面给出一个建立在进程隔离基础上的C/Python计算样例 1.C侧的包裹代码 注意这里的最大问题是利用共享内存的传参。二进制信息可以通过共享内存有效传递,在真正的工业代码中,无需频繁创建共享内存,它可以一直存在。 #define S…

SpringMVC初始化工程

SpringMVC初始化工程 本文采用maven作为构建工具,SpringMVC作为主框架。 创建一个maven的web工程,并配置pom文件<!-- pom.xml --> <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0&qu…

【nginx】nginx通过配置文件阻止海外ip访问

本文首发于 ❄️慕雪的寒舍 nginx通过配置文件阻止海外ip访问 说明 因为最近发现有不少刷评论的脚本&#xff0c;在nginx请求日志里面看了眼&#xff0c;都是海外的ip&#xff0c;反正我的博客也是全中文。所以干脆把海外ip禁止artalk评论。 在/etc/nginx/nginx.conf中可以看…

海外代理IP购买指南:住宅IP代理VS.数据中心代理IP

在选择海外IP代理服务时&#xff0c;您将面临一个关键的问题&#xff1a;是选择住宅代理IP还是数据中心代理IP&#xff1f;这两者之间存在着根本性的不同&#xff0c;涉及到性能、隐私和成本等方面的考虑。住宅代理IP通常来自真实的住宅网络连接&#xff0c;更难被检测到。数据…

Winforms中的ArgumentOutOfRangeException异常

// 定时器事件 只处理计时逻辑 每隔1000毫秒会被调用。 private void timer1_Tick(object sender, EventArgs e) {count; //记录当前秒label3.Text (time - count).ToString() " 秒"; progressBar1.Value count;if(count time){timer1.Stop(); //关闭计时Sys…

MotionBuilder 脚本执行

目录 MediaPipe_Pose_in_MotionBuilder 你可以用以下几种方式执行你的脚本&#xff1a; MediaPipe_Pose_in_MotionBuilder https://github.com/Ndgt/MediaPipe_Pose_in_MotionBuilder/blob/main/PoseLandmark.py tcp通信 https://github.com/nils-soderman/motionbuilder-s…

解决Android Studio Loading Devices问题

目录 一、解决办法&#xff08;普通&#xff09;&#xff1a; 二、解决办法的优化 三、解决办法的进一步优化 问题&#xff1a;windows 11 电脑&#xff0c;每次开机&#xff0c;打开Android Studio,都会显示Loading Devices&#xff0c;连接不上设备。 原因&#xff1a;adb…

Jpa中QueryPlanCache查询计划JPQL缓存

// 所以,项目大,缓存的JPQL多,占用的堆空间也多 // 在in的场景下,可能会出现内存泄露 // 因为各种Repository的查询,并且随着in的参数个数不同,queryPlanCache缓存的in的sql越来越多,这样时间久了就会出现无法释放,甚至可能出现OOM // 我们可以通过hibernate.query.plan_cache_…