首页 > 编程语言 >《汇编语言》第3版 (王爽)实验7解析

《汇编语言》第3版 (王爽)实验7解析

时间:2024-03-19 16:29:41浏览次数:27  
标签:16 汇编语言 mov si es ax 解析 bx 王爽

实验7 解析


实验7 寻址方式在结构化数据访问中的应用
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
解析:
方法一:将每个数据项逐个进行传输,共有4个数据项(分别是年份、收入、雇员数、人均收入)人均收入需要计算后得到,每个数据项又有21个元素,所以需要传输21次

assume cs:code

data 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
data ends

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

code segment

 start:mov ax,data
       mov ds,ax ;ds指向data
       mov ax,table
       mov es,ax ;es指向table
       mov si,0 
       mov di,0
       mov bx,0

      ;转移年份
       mov cx,21 ;一共21个年份
  year:mov ax,ds:[si] ;将数据中的年份低16位取出放入ax中
       mov es:[bx],ax ;将ax中的数据放入table中
       mov ax,ds:[si+2]  ;将数据中的年份高16位取出放入ax中
       mov es:[bx+2],ax  ;将ax中的数据放入table中
       add si,4 ;si+4指向下一个年份
       add bx,16 ;bx+16指向下一个数组
       loop year ;转移到year

       ;转移收入
       mov bx,0
       mov di,5 ;设定table存放收入的起始地址
       mov cx,21 
income:mov ax,ds:[si] ;转移收入低16位
       mov es:[bx+di],ax
       mov ax,ds:[si+2] ;转移收入高16位
       mov es:[bx+di+2],ax
       add bx,16 ;bx+16指向下一组数据
       add si,4  ;si+4指向下一个收入
       loop income ;转移到income

       ;转移雇员数
       mov bx,0
       mov di,10 ;设定table存放雇员数的起始地址
       mov cx,21
   Num:mov ax,ds:[si] ;转移雇员数(只有两字节,所以使用ax传输一次即可)
       mov es:[bx+di],ax
       add bx,16 ;bx+16指向下一组数据
       add si,2 ;si+2指向下一个雇员数
       loop Num
        
       ;计算人均收入
       mov bx,0
       mov cx,21
 pcome:mov ax,es:[bx+5] ;低16位放入ax中
       mov dx,es:[bx+5+2] ;高16位放入dx中
       div word ptr es:[bx+10] ;除以人数
       mov es:[bx+13],ax ;商存放在ax中
       add bx,16 
       loop pcome

       mov ax,4c00h
       int 21h

 code ends
 end start

方法二:一次传输一组数据,一共传输21次

assume cs:code

data 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
data ends


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

code segment
start:mov ax,data
      mov ds,ax  ;ds指向data
      mov ax,table
      mov es,ax  ;es指向table
      mov si,0
      mov di,0
      mov bx,0
  
      mov cx,21 ;一个21组数据
    s:;转移年份(4字节)
      mov ax,ds:[si] ;转移年份低16位
      mov es:[bx],ax
      mov ax,ds:[si+2] ;转移年份高16位
      mov es:[bx+2],ax
      ;转移收入(4字节)
      mov ax,ds:[si+84] ;转移收入低16位
      mov es:[bx+5],ax
      mov ax,ds:[si+84+2] ;转移收入高16位
      mov es:[bx+7],ax
      ;转移雇员数(2字节)
      mov ax,ds:[168+di] ;转移雇员数(只有2字节,所以使用ax转移一次即可)
      mov es:[bx+10],ax
      ;计算人均收入(2字节)
      mov ax,es:[bx+5] ;将收入的低16位放入ax中
      mov dx,es:[bx+5+2] ;将收入的高16位放入dx中
      div word ptr es:[bx+10] ;除以雇员数
      mov es:[bx+13],ax ;将商保存(除法后商存放在ax中)

      add di,2 ;di+2指向下一个雇员数
      add si,4 ;si+4指向下一个年份和收入
      add bx,16 ;bx+16指向下一组数据
      loop s

      mov ax,4c00h
      int 21h

code ends
end start

将上面程序在DOS中运行后效果如下:
在这里插入图片描述
在这里插入图片描述

标签:16,汇编语言,mov,si,es,ax,解析,bx,王爽
From: https://blog.csdn.net/qq_43276544/article/details/136846658

相关文章

  • 腾讯春招内参:2024最全Spring Boot面试题解析,技术精英必备!
    随着2024年春季招聘季的来临,腾讯再次开启了对富有才华和创新精神的技术人才的寻找之旅。作为一家全球领先的互联网科技公司,腾讯在寻找那些不仅拥有扎实的技术基础,而且能够适应快速发展和变化的行业环境的候选人。在众多技术栈中,SpringBoot作为简化Spring应用开发的工具,因其......
  • 数据库查询优化:解析不使用索引的场景及对策
    数据库索引的目的是为了加快查询速度,但在某些情况下,查询可能不会使用索引,即所谓的“不走索引”。以下是一些可能导致数据库查询不使用索引的情况:全表扫描:当查询条件中的字段没有建立索引,或者查询的条件是对整个表进行范围查询(如使用 BETWEEN),数据库可能会选择全表扫描而不是使......
  • 自动更新DNS解析
    背景目前有两个做ddns的开源项目,我们选择了:https://gitee.com/Xsssd/ddns4j原因是这个能提供web界面,缺点是只有2种获取本机公网IP的方式。编写docker-compose.yml把官网提供的dockerrun命令转换一下:version:'3.6'services:ddns:image:'topsssd/ddns4j:v1.6.4'......
  • Semaphore源码解析
    Semaphorehttps://www.bilibili.com/video/BV1Ae411C7xr/publicclassSemaphoreimplementsjava.io.Serializable同Reetrantlock在Sync继承AQSabstractstaticclassSyncextendsAbstractQueuedSynchronizer可以指定Sync是否是公平锁,默认非公平permits为设置AQS内stat......
  • ubuntu域名解析暂时失效解决办法
    你好!如果你在Ubuntu虚拟机中遇到域名解析失效的问题,我可以提供一些解决方法。请注意,以下方法适用于VMware虚拟机中的Ubuntu。修改DNS设置:打开终端(命令行)。输入以下命令以编辑resolv.conf文件:sudovi/etc/resolv.conf进入编辑模式(按i键)。在文件中添加以......
  • AI换脸神器A kool全面解析:超简单1分钟操作,创意爆棚,商业前景广阔!
    大家好,今天我要给大家介绍一款超级好用的AI换脸工具-Akool。这款工具不仅简单易用,而且在数字营销领域有着广泛的应用,比如定制写真、影视换脸、虚拟网红、短剧出海等等。听起来是不是很神奇呢?接下来,我就带大家一起了解一下这款神奇的AI换脸工具。一、Akool简介Akool是一......
  • Java 文件处理完全指南:创建、读取、写入和删除文件详细解析
    Java文件操作文件处理简介文件处理是任何应用程序的重要部分。Java提供了许多用于创建、读取、更新和删除文件的方法。Java文件处理Java中的文件处理主要通过java.io包中的File类完成。该类允许我们处理文件,包括创建、读取、写入和删除文件。创建File对象要使用F......
  • 【OceanBase OBCP题目解析13】关于OceanBase的合并设置,以下说法正确的是
    本文为云贝教育郭一军(微信:guoyJoe)原创,请尊重知识产权,转发请注明出处,不接受任何抄袭、演绎和未经注明出处的转载。关于OceanBase的合并设置,以下说法正确的是 ?A.修改合并时间命令例如altersystemsetmajor_freeze_duty_time='02:00'B.修改合并时间命令例如altersystem......
  • 【PostgreSQL PGCE-091题目解析14】PostgreSQL中使用CONCURRENTLY选项创建索引时,允许
    本文为云贝教育刘峰(微信:yunbee_DBA)原创,请尊重知识产权,转发请注明出处,不接受任何抄袭、演绎和未经注明出处的转载。PostgreSQL中使用CONCURRENTLY选项创建索引时,允许增删改数据表。A.正确B.错误参考答案:A解析:我们知道,PG是有行级琐的,在创建索引的时候,会在行上加琐......
  • ThreadPoolExecutor源码解析
    publicclassThreadPoolExecutorextendsAbstractExecutorServiceprivatefinalAtomicIntegerctl=newAtomicInteger(ctlOf(RUNNING,0));ctlint32位高3位状态位,低29位工作线程数量//PackingandunpackingctlprivatestaticintrunStateOf(intc){return......