汇编语言(第四版)第八章 实验7 习题解答

news2024/11/17 22:30:48

Power idea 公司从1975年成立一直到1995年的基本情况如下:

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

assume cs:codesg,ds:datasg

datasg segment
    db '1975','1976','1977','1978','1979','1980','1981','1982','1983'
	db '1984','1985','1986','1987','1988','1989','1990','1991','1992'
	db '1993','1994','1995'
    ;以上是表示 21 年的 21 个字符串

    dd 16,22,382,1356,2390,8000,16000,24486,50065,97479,140417,197514
	dd 345980,590827,803530,1183000,1843000,2759000,3753000,4649000,5937000
    ;以上是表示 21 年公司总收入的 21 个 dword 型数据

    dw 3,7,9,13,28,38,130,220,476,778,1001,1442,2258,2793,4037,5635,8226
	dw 11542,14430,15257,17800
    ;以上是表示21年公司雇员人数的 21 个 word 型数据
datasg ends

table segment
    db 21 dup('year summ ne ?? ')
table ends

编程,将data段中的数据按如下格式写入到 table 段中,并计算 21 年中的人均收入(取整),结果也按照下面的格式保存在 table 段中。

分析:本实验中的表格规格是固定的,操作起来就相对简单一些。我们可以直接遍历数据段或者按行遍历数据段

方法一:直接遍历数据段

(1)先遍历年份、收入、人数

由于表格的每行长度为16字节,如果当前表格中遍历的年份位置是es:[di],则下一年在表格的位置是es:[di+16],以此类推将年份、总收入、人数依次案列填入表格中,每次遍历后递增4字节或2字节(年份、总收入占4个字节,总人数占两个字节,还要注意空格),遍历总收入时将数据段总收入首地址保存在栈中,之后计算平均值要用到。

(2)计算平均值

在遍历数据段人数填入表格时时,将数据段总收入首地址从栈中弹出,根据首地址读取总收入放入AX和DX中,将总人数放入BX中,利用div指令计算平均值填入表格中。

assume cs:codesg,ds:datasg,es:table,ss:stacksg

datasg segment
    db '1975','1976','1977','1978','1979','1980','1981','1982','1983'
    db '1984','1985','1986','1987','1988','1989','1990','1991','1992'
    db '1993','1994','1995'

    dd 16,22,382,1356,2390,8000,16000,24486,50065,97479,140417,197514
    dd 345980,590827,803530,1183000,1843000,2759000,3753000,4649000,5937000

    dw 3,7,9,13,28,38,130,220,476,778,1001,1442,2258,2793,4037,5635,8226
    dw 11542,14430,15257,17800

datasg ends

table segment
    db 21 dup('year summ ne ?? ')
table ends

stacksg segment
    dw 2 dup (0) ;栈段用于保存总收入首地址,也可以不使用栈直接用 ds:54h 表示栈段首地址(因为表格固定)
stacksg ends

codesg segment

start:mov ax,datasg   ;初始化数据段、table段、栈段地址
      mov ds,ax
      mov ax,table
      mov es,ax
      mov ax,stacksg
      mov ss,ax
      mov cx,21
      mov bx,0
      mov si,0
      mov di,0
s0:                      ;将年份按列填入表格
      mov ax,[si]
      mov es:[di],ax
      mov ax,[si+2]
      mov es:[di+2],ax
      add di,16
      add si,4
      loop s0

      mov di,5
      mov cx,21        ;保存总收入首地址,之后计算平均值要用
      push si
s1:                    ;将总收入按列填入表格
      mov ax,[si]
      mov es:[di],ax
      mov ax,[si+2]
      mov es:[di+2],ax
      add di,16
      add si,4
      loop s1

      mov di,0ah
      mov cx,21
s2:                    ;将总人数按列填入表格,同时计算平均值
      mov ax,[si]
      mov es:[di],ax
      ;;;; 将数据段总人数当前地址临时放入栈中,让出si寄存器
      pop bx
      push si
      mov si,bx
      ;;;;; 计算平均值
      mov bx,ax
      mov ax,[si]
      mov dx,[si+2]
      div bx
      ;;;; 将平均值填入表格中,同时栈中si寄存器恢复
      mov es:[di+3],ax
      add si,4
      pop bx
      push si
      mov si,bx

      add di,16
      add si,2
      loop s2

      mov ax,4c00h
      int 21h

codesg ends

end start

方法二:按行遍历数据段

 

 在按行进行遍历时,先确定数据段中三种数据的基址,如上图所示,年份:ds:00H、总收入:ds:54H、人数:ds:a8H,然后根据基址加上偏移量所得地址找到数据后逐个按行填入表格,遍历下一行时,年份、总收入的偏移量+4,人数的偏移量+2 逐行遍历时,还要同时计算平均值填入表格即可。

assume cs:codesg,ds:datasg,es:table

datasg segment
    db '1975','1976','1977','1978','1979','1980','1981','1982','1983'
    db '1984','1985','1986','1987','1988','1989','1990','1991','1992'
    db '1993','1994','1995'

    dd 16,22,382,1356,2390,8000,16000,24486,50065,97479,140417,197514
    dd 345980,590827,803530,1183000,1843000,2759000,3753000,4649000,5937000

    dw 3,7,9,13,28,38,130,220,476,778,1001,1442,2258,2793,4037,5635,8226
    dw 11542,14430,15257,17800

datasg ends

table segment
    db 21 dup('year summ ne ?? ')
table ends

codesg segment

start:mov ax,datasg    ;初始化数据段、table段
      mov ds,ax
      mov ax,table
      mov es,ax
      mov si,0
      mov di,0
      mov bx,0
      mov cx,21

s0:                        ;按行循环填入表格
      mov ax,0h[bx]
      mov es:0h[di],ax    ;将每行的年份填入表格
      mov ax,2h[bx]
      mov es:2h[di],ax

      mov ax,54h[bx]    ;将每行的总收入填入表格
      mov es:5h[di],ax
      mov dx,56h[bx]    ;这里使用dx存储总收入高位部分,后面计算平均值要用到
      mov es:7h[di],dx

      mov ax,0a8h[si]    ;将每行的人数填入表格
      mov es:0ah[di],ax

      mov ax,54h[bx]     ;之前ax存储总收入低位部分被覆盖了,要重新存一下
      div word ptr 0a8h[si];计算平均值,由于bx要存储偏移量,故除数直接从内存寻址。
      mov es:0dh[di],ax    ;将内存结果填入表格

      add bx,4    ;年份、总收入占4个字节,每次+4
      add si,2    ;人数只占两个字节,每次只需+2
      add di,16   ;表格每行占16个字节,遍历下一行时要+16

      loop s0

      mov ax,4c00h
      int 21h

codesg ends

end start

将数据填入表格后如下所示:

 

 

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

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

相关文章

【12】C语言_几个循环的经典练习

目录 1. 打印n的阶乘; 2、计算 1!2!3!......10! 3、用二分查找在一个有序数组中查找一个数 4、打印如下 5、输入三次密码 6、写一个猜数字游戏 7、如题 8、打印1到100之间 3的倍数 9、给两个数,求出最大公约数 10、找出从1000到2000之间的闰年 11、找出10…

Java是编译性语言还是解释型语言 ?

首先我们应该了解这两种语言的概念 . 高级语言在计算机上执行 , 有两种方式 , 分为编译型语言和解释型语言 . 编译型语言 : 编写源代码–>编译–>链接. 典型的编译型语言 : C/C . 特点 : 源代码中一处有错 , 就不允许编译 ; 编译过程中出现一处错误 , 就停止编译 . 优…

论文投稿指南——中文核心期刊推荐(武器工业)

【前言】 🚀 想发论文怎么办?手把手教你论文如何投稿!那么,首先要搞懂投稿目标——论文期刊 🎄 在期刊论文的分布中,存在一种普遍现象:即对于某一特定的学科或专业来说,少数期刊所含…

4个免费数据恢复软件:免费恢复您的数据

意外的文件删除或文件损坏可能会令人头疼,尤其是在您不使用云存储的情况下。两者通常都支持已删除的文件恢复和版本控制,以帮助您摆脱此类困境。如果您不使用云,通常唯一的机会就是使用数据恢复软件来找回丢失或损坏的数据。 这种方法有两个…

使用 Burpsuite 测试的常用操作(二)

大家好啊,我是大田。接上篇文章「 使用 Burpsuite 测试的常用操作(一)」,今天继续分享一下 Burpsuite 在工作中常用操作三、本文中 2 个常用操作1、Burpsuite_proxy 篡改请求通过代理模式可以拦截、查看、修改所有客户端和服务器端…

(二)Linux嵌入式开发——软件安装(Ubuntu)

文章目录(二)Linux嵌入式开发——软件安装(Ubuntu)APP StoreAPT工具问题解决办法1解决办法2deb软件包程序源码问题1解决办法问题2解决办法总结(二)Linux嵌入式开发——软件安装(Ubuntu) 接下来,…

【GD32F427开发板试用】FOC矢量算法研究系列之一:PWM实现呼吸灯

本篇文章来自极术社区与兆易创新组织的GD32F427开发板评测活动,更多开发板试用活动请关注极术社区网站。作者:Q_dGHvwj 前言 有幸被选为此次开发板测评活动的参与者,万分感谢。收到板子后迫不及待的拆来查看,画风整齐美观&#x…

SpringCloudAlibabaNacosConfig学习笔记

目录 1. Nacos配置中心使用 2 搭建nacos-config服务 3 Config相关配置 4 .配置的优先级 5. RefreshScope 1. Nacos配置中心使用 官方文档: https://github.com/alibaba/springcloudalibaba/wiki/Nacosconfig Nacos 提供用于存储配置和其他元数据的key/value 存…

23种设计模式(十三)——代理模式【接口隔离】

文章目录 意图什么时候使用代理真实世界类比代理模式的实现代理模式的优缺点亦称:Proxy 意图 由于某些原因需要给某对象提供一个代理以控制对该对象的访问。这时,访问对象不适合或者不能直接引用目标对象,代理对象作为访问对象和目标对象之间的中介。 什么时候使用代理 1、…

论文投稿指南——中文核心期刊推荐(环境科学)

【前言】 🚀 想发论文怎么办?手把手教你论文如何投稿!那么,首先要搞懂投稿目标——论文期刊 🎄 在期刊论文的分布中,存在一种普遍现象:即对于某一特定的学科或专业来说,少数期刊所含…

操作系统-操作系统引论(1)

操作系统的基本概念一、操作系统的定义二、操作系统的产生与发展三、操作系统的特征四、操作系统的功能五、操作系统的运行机制六、操作系统的体系结构一、操作系统的定义 资源管理的观点:操作系统是控制和管理计算机的软、硬件资源,并且合理的组织计算…

通过C++对【图】进行抽丝剥茧(包括广度、深度优先遍历,求最小生成树,求最短路径)

目录 一.图的基本概念 二.图的存储结构 1.邻接矩阵 (1)无向图、有向图矩阵存储 (2)实现: 2.邻接表 (1)无向图邻接表存储 (2)有向图邻接表存储 (3&a…

windows下运行ROSEFusion

其实LZ已经不再是两年前的Linux小白了,至于为什么要在windows下配置环境,是因为LZ在Linux下已经成功编译成功了ROSEFusion,但运行时一直报错Frame could not be processed,在github下的issue里面查询得知可能是CUDA版本问题。另外…

VM16 Pro+ubuntu20.04.5+GAMIT10.71安装(20230118更新包)

VMware Workstation 16 Proubuntu20.04GAMIT10.71安装测绘老中医(qq8212714)(2023-01-20)NOTE:安装环境:Windows 10 专业版,64 位操作系统, 基于 x64 的处理器1、首先在计算机中安装VMware Workstation 16 …

交叉编译(全志)

文章目录一、交叉编译概念二 、香橙派交叉编译3.带WiringPi库的交叉编译一、交叉编译概念 交叉编译,就是:在一种平台上编译,编译出来的程序,是放到别的平台上运行即编译的环境,和运行的环境不一样,属于交叉…

【基础】高低位和大小端

大小端模式出现是为了兼容不同CPU采用的不同的指令集 PowerPC架构和x86架构采用的是不同的CPU指令集。PowerPC采用精简指令集(RISC,reduced instruction set computer),x86指的是特定微处理器执行的一些计算机语言指令集。 Powe…

Obsidian 插件(一):DataView 的使用

文章目录DataView 的使用一、 环境配置二、 入门介绍1、 快速开始2、 页面和字段3、 创建查询4、 系统字段三、 接口讲解1、 表达式1.1 概述1.2 表达式类型1.3 特定类型的交互2、 函数2.1 构造器2.2 常用函数2.3 工具函数DataView 的使用 一、 环境配置 首先,我们…

ESP32设备驱动-DHT11温度湿度传感器驱动

DHT11温度湿度传感器驱动 1、DHT11介绍 DHT11数字温湿度传感器是一种复合传感器,包含一个经过校准的温湿度数字信号输出。 应用了专用的数字模块采集技术和温湿度传感技术,确保产品具有高可靠性和优异的长期稳定性。 该传感器包括一个电阻感湿元件和一个 NTC 温度测量装置,…

LeetCode题目笔记——1814. 统计一个数组中好对子的数目

文章目录题目描述题目难度——中等方法一:模拟(超时)(参考)代码/Python方法二:优化代码总结题目描述 给你一个数组 nums ,数组中只包含非负整数。定义 rev(x) 的值为将整数 x 各个数字位反转得…

Kong Api Gateway

Kong Api Gateway什么是API 网关为什么是 Kong安装Kong通过包管理器来安装启动Kong配置文件详解1、常规配置2、Nginx注入配置3、数据库存储配置4、数据库缓存配置DNS解析器配置其他杂项配置API 管理详解1、查看节点信息2、查看节点状态3、添加服务4、查询服务5、查询所有服务6、…