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

有一年多没有在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,一经查实,立即删除!

相关文章

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

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

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

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

邮件服务器:Postfix

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

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

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

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

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

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

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

SpringBoot实现邮箱验证

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

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

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

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 你可以用以下几种方式执行你的脚本: 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问题

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

css实现更改checkbox的样式;更改checkbox选中后的背景色;更改checkbox选中后的icon

<input class"check-input" type"checkbox"> .check-input {width: 16px;height: 16px;} /* 设置默认的checkbox样式 */input.check-input[type"checkbox"] {-webkit-appearance: none; /* 移除默认样式 */border: 1px solid #999;outl…

鹏哥C语言复习——结构体

目录 结构体声明&#xff1a; 结构体内存存储相关介绍&#xff1a; 结构体的初始化与使用&#xff1a; 结构体的初始化&#xff1a; 结构体的使用&#xff1a; 结构体对齐&#xff1a; 结构体对齐原则解释&#xff1a; 结构体对齐存在的原因&#xff1a; #pragma pack…

人工智能研究生前置知识—Anaconda与python工作环境

人工智能研究生前置知识—Anaconda与python工作环境 python环境管理 python工作环境的管理是需要满足的基本条件&#xff0c;指的是不同的python版本之间的切换。或者说是允许安装不同版本的python 解决&#xff1a;conda是一个跨平台的包管理工具&#xff0c;其环境管理功能允…

Docker容器与虚拟化技术:OpenEuler 部署 ES 与 Kibana

目录 一、实验 1.环境 2.OpenEuler 部署 ES (EalasticSearch) 3.OpenEuler 部署 Kibana 4.部署 Elasticvue插件 5.使用cpolar内网穿透 6.使用Elasticvue 一、实验 1.环境 &#xff08;1&#xff09;主机 表1 主机 系统架构版本IP备注LinuxopenEuler22.03 LTS SP2 1…

RabbitMQ3.13.x之九_Docker中安装RabbitMQ

RabbitMQ3.13.x之_Docker中安装RabbitMQ 文章目录 RabbitMQ3.13.x之_Docker中安装RabbitMQ1. 官网2. 安装1 .拉取镜像2. 运行容器 3. 访问 1. 官网 rabbitmq - Official Image | Docker Hub 2. 安装 1 .拉取镜像 docker pull rabbitmq:3.13.0-management2. 运行容器 # lates…

就业班 第二阶段 2401--4.1 day10 shell之“三剑客”+Expect

十一、shell 编程-grep egrep 支持正则表达式的拓展元字符 &#xff08;或grep -E&#xff09; #egrep [0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3} file1.txt [rootnewrain ~]# num11 1、运用正则&#xff0c;判断需要[[ ]] [rootnewrain ~]# [[ $num1 ~ ^[0-9]$ ]] &a…

C++ 一种简单的软件验证码 程序授权使用 收费付费使用 无需注册 用机器码得到一个加密值 再对比加密值是否一致 只需加密

简单软件授权方案 1、获取机器码&#xff0c;发给软件开发者 2、开发者用机器码加密得到一个密文 发给使用者 3、使用者 用这个密文 与本地计算密文比较密文是否一致&#xff0c;一致就把密文写入到注册表&#xff0c;下次登录从注册表读密文对比。 &#xff08;最重要的是密…

设计模式总结-适配器模式

适配器模式 模式动机模式定义模式结构适配器模式实例与解析实例一&#xff1a;仿生机器人实例二&#xff1a;加密适配器 总结 模式动机 在软件开发中采用类似于电源适配器的设计和编码技巧被称为适配器模式。 通常情况下&#xff0c;客户端可以通过目标类的接口访问它所提供的…

ollama 本地轻松安装及使用docker web

这里视频其实还是蛮多的&#xff0c;环境是win10 Linux当然更好&#xff0c;奈何win10还有很多其他的AIGC的环境 所以还是索性在一个环境上比较好 1 下载 Download Ollama on macOS 修改成windows 有windows 版本所以直接下载 下载完毕后直接cmd 输入相应的下载模型 这里…