编写一个汇编语言程序,完成以下要求。从BUF单元处定义有10个带符号字数据:-1,3,24,94,62,72,55,0,-48,99,试找出他们中的最大值和平均值,并以此分别存放至该数据区的后两个单元中(假设这10个数的和值不超过16位范围)

P176
4.12

编程思路:首先DATA段中,定义BUF为DW数据类型,因为存在带符号字数据,N为记录BUF的数据总个数,MAX为DW数据类型存放最大值,AVE为DB数据类型且占用两个物理单元,分别存放平均值的整数部分和小数部分;接着,使用SI获取BUF的有效地址,AX存放以次存放BUF中的数据,并且与下一个数据进行比较大小,若AX小于[SI]则将大的值[SI]赋值给AX,否则进行[SI+2]下一个数据进行与AX比较,AX始终存放BUF数据中的最大值;CX存放数据的总个数,DX依次存放BUF的数据相加之和;最后,将总数据之和/总个数=商(平均分的整数部分)存放在AVE中,余数(平均分的小数部分)存放在AVE+1中。

代码如下:

DATA SEGMENT
BUF DW -1,3,24,94,62,72,55,0,-48,99
N   EQU ($-BUF)/2   ;由于定义的BUF为DW字类型,每个数据占两个物理单元,最后个数除以二,这里的N为BUF的长度
MAX DW  ?           ;用于存放BUF中最大的数据值
AVE DB  ?   ?       ;由于题目规定平均值需要存放在最大值后,定义两个DB类型,第一个存放商(平均值的整数部分),第二个存放余数(平均值的小数部分)
DATA    ENDS
CODE    SEGMENTASSUME   CS:CODE,DS:DATA
START:  MOV AX,DATA ;由于DATA为立即数,DS为段寄存器,立即数不能直接给段寄存器赋值,需要引用AX通用寄存器MOV  DS,AX   ;通用寄存器赋值给段寄存器LEA    SI,BUF  ;LEA取有效地址指令。将源操作数的有效地址送到指令中指定的寄存器中,源操作数只能是存储器操作数,目的操作数只能是16位的通用寄存器CLC         ;标志位操作指令CLC。CF=0,使进位标志位CF清零XOR  AX,AX   ;AX清零操作XOR  DX,DX   ;DX清零操作MOV  AX,[SI] ;将SI内容赋值给AX,即BUF中的内容,由于AX为16位通用寄存器,且BUF也为DW类型,一个数据占两个物理单元,即该指令操作是正确合法的MOV    CX,N    ;CX为循环次数/BUF存放的数据个数
NEXT:   ADC DX,[SI] ;由于BUF单元处定义的是带符号字数据,进行运算的时候需要相加,所以要使用ADC带进位的加法指令 即DX为所有数相加之后的和 用来存放最后的和的结果CMP AX,[SI] ;比较AX和[SI]中的大小JGE   GOON    ;若AX>=[SI]跳转大GOON标签处,否则执行下一条指令 即AXMOV    AX,[SI] ;执行到此条指令表[SI]要比AX大,需要将数值大的[SI]存到AX中,使得AX始终存放最大值
GOON:   ADD SI,2    ;由于BUF为DW数据类型,所以需要SI+2才可以指向下一个数据LOOP NEXT   ;CX-1,若CX≠0,跳转 即接着比较下一个数MOV   MAX,AX  ;执行到此指令表示数据已经全部比较完成,最大值存放在AX中MOV BL,N    ;BL为BUF的数据总个数MOV    AX,DX   ;将最后的所有数据的和的结果赋值给AXIDIV BL      ;IDIV带符号的除法指令 隐含被除数为AX(存放着所有数的总和) 商为AL 余数为AHMOV AVE,AL  ;将商(平均分的整数部分)赋值给AVEMOV  AVE+1,AH;由于AVE为DB数据类型,下一个存储单元+1即可,将AH余数(平均分的小数部分)赋值给AVE+1MOV   AH,4CH  ;DATA   SEGMENT
string  DB  "Hello World!"    ;将需要转换的字符串存放到string中,定义类型为DB型
LEN EQU $-string            ;等值伪指令EQU,将LEN表示string的长度
DATA    ENDS
CODE    SEGMENTASSUME   CS:CODE,DS:DATA
START:  MOV AX,DATA ;由于DATA为立即数,不能用赋值给段寄存器DS,需要借助AX通用寄存器MOV   DS,AX   ;将AX赋值给DSMOV    BX,OFFSET string    ;BX获取string的有效地址用于取出string中的字符串MOV  CL,LEN  ;CL为string字符串的长度
NEXT:   MOV AL,[BX] ;此时[BX]为string所存放字符串的内容,赋值给ALCMP AL,'a'    ;由于是DB字节类型,只需要将AL的一个字节单元与单个字符'a'进行比较JB LOP     ;JB为小于跳转,即AL存放的字节单元的内容所对应的ASCII码值小于'a'所对应的ASCII码值,跳转到LOP标签处 否则不跳转执行下一条指令CMP AL,'z'    ;若执行到此条指令,代表AL>='a',接下来需要与'z'进行比较即可JA LOP     ;JA为大于跳转,即AL存放的字节单元的内容所对应的ASCII码值大于'z'所对应的ASCII码值,跳转到LOP标签处 否则不跳转执行下一条指令  SUB   AL,20H  ;执行到此条指令,表示以及确定此时的AL为小写字母,AL-20H表示将小写字母转换为所对应的大写字母(小写字母比对应的大写字母的ASCII码值大20H)MOV [BX],AL ;将小写字母转换为对应的大写字母结束后,结果AL存放回原来的物理地址[BX]处
LOP:    INC BX      ;BX+1(因为DB字节类型),表示判断下一个字节单元存放的字符串DEC  CL      ;CL-1,表示字符串string所需要判断字符的长度减一JNZ NEXT    ;若CL不为0,即字符串string仍有需要判断的字符,跳转到NEXT标签处MOV AH,4CH  ;调用4CH号功能,返回DOS操作系统INT   21H     ;终止当前程序的运行,并返回DOS系统
CODE    ENDSEND START

编写一个汇编语言程序,完成以下要求。从BUF单元处定义有10个带符号字数据:-1,3,24,94,62,72,55,0,-48,99,试找出他们中的最大值和平均值,并以此分别存放至该数据区的后两个单元相关推荐

  1. 试编写一个汇编语言程序,要求从键盘接收一个四位的十六进制数,并在终端上显示与它等值的二进制数

    试编写一个汇编语言程序,要求从键盘接收一个四位的十六进制数,并在终端上显示与它等值的二进制数 data segment data ends stack segment stack dw 30h dup ...

  2. 试编写一个汇编语言程序,要求对键盘输入的小写字母用大写字母显示出来

    试编写一个汇编语言程序,要求对键盘输入的小写字母用大写字母显示出来 DATA SEGMENT DATA ENDS STACK SEGMENT STACK ENDS CODE SEGMENT ASSUM ...

  3. 编写一个汇编语言程序,将字符串Hello World中的全部小写字母转换为大写字母,并存放回原地址处。

    编写一个汇编语言程序,将字符串"Hello World"中的全部小写字母转换为大写字母,并存放回原地址处. P176 4.10 编程思路:首先DATA段中,定义string存放字符 ...

  4. 编写一个汇编语言程序,有一个50个数据的数据区,找出最大数和最小数,分别存放在AX和BX寄存器中

    [微机原理]-汇编题 编写一个汇编语言程序,有一个50个数据的数据区,找出最大数和最小数,分别存放在AX和BX寄存器中. DATA SEGMENT NUM DB 21H,34,23H...DATA E ...

  5. AX寄存器中存放着16位二进制数。试编写一个汇编语言程序,将这4位十六进制数分别转换为相应的ASCⅡ码,并依次存放到PLUS数组的4个字节中去,要求用调用子程序的方法实现

    [微机原理]-汇编题 AX寄存器中存放着16位二进制数.试编写一个汇编语言程序,将这4位十六进制数分别转换为相应的ASCⅡ码,并依次存放到PLUS数组的4个字节中去,要求用调用子程序的方法实现. 方法 ...

  6. 试编写一个汇编语言程序,要求对键盘输入的小写字母用大写字母显示出来。(两种方法/每步详解)

    试编写一个汇编语言程序,要求对键盘输入的小写字母用大写字母显示出来. 小写变大写的实现方法: 1.SUB AL,32 ; 只能满足于输入只是小写的时候 2. AND AL,11011111B ; 该方 ...

  7. 【汇编】 编写一个汇编语言程序,要求对键盘输入的小写字母用大写字母显示出来。

    编写一个汇编语言程序,要求对键盘输入的小写字母用大写字母显示出来.

  8. python找出矩阵中的最大值_Python例题:找到并输出矩阵中的最大值

    早就听说Python是一门很强大的语言,不过一直没有什么机会去学.直到前一段时间我的技术群里有人问我了一道Python的题目,本着帮助他人.充实自己的想法,我二话不说就去查找资料,做出了这道题.也算是 ...

  9. python取出字典中最大值_python找出字典中value最大值的几种方法

    假设定义一字典,m = {"a":3,"e":6,"b":2,"g":7,"f":7,"c ...

最新文章

  1. 实验三:实现一个大素数生成算法
  2. 下面方框中,那些包括有220欧姆的电阻呢?
  3. tpp letter
  4. 微软发布 VS Code 容器化开发工具,大大简化物联网设备开发
  5. aix pax_通过Pax考试对JBoss Fuse 6.x进行集成测试,第一部分
  6. 全连接神经网络_【模型解读】从“局部连接”回到“全连接”的Non-Local神经网络...
  7. oracle修改undo清理时间,修改Oracle的Undo文件的方法
  8. 在Objective-C中,如何测试对象类型?
  9. ios开发之cocoapods导入新三方库报错RuntimeError - [Xcodeproj] Unknown object version.
  10. 项目任务管理工具Project Office for mac
  11. config.o:文件无法辨识_HAZOP有哪些局限性,及系统生命周期不同阶段的危险辨识...
  12. 微信公众平台测试账号的注册与申请
  13. 故障分析 | OceanBase Proxy 无法连接 OBserver 集群
  14. OA协同办公系统未来的趋势
  15. 震惊一个月销800万的模式,全新拼团模式全攻略(运营干货)
  16. 【数据安全】4. Android 文件级加密(File-based Encryption)之密钥管理
  17. 电脑计算机打不开显示远程过程,Win10打不开图片提示“远程过程调用失败”的解决方案...
  18. 51nod1635 第K个幸运排列
  19. Sentry 企业级数据安全解决方案 - Relay PII 和数据清理
  20. 如何将你的网站提交到Google

热门文章

  1. java垃圾回收机制优化_JVM性能优化--Java的垃圾回收机制
  2. 华为硬件工程师社招机考题库_干货:2016年华为中兴硬件工程师笔试题目与经验...
  3. yearProgress.vue
  4. css实现div内一段文本的两端对齐
  5. 如何用纯 CSS 创作一个冒着热气的咖啡杯
  6. 纯CSS实现3D照片墙
  7. html实现 页面禁止右键 禁止复制 禁止图片拖动 禁止复制和剪切
  8. What?一个 Dubbo 服务启动要两个小时!
  9. SCP 报错 not a regular file
  10. 08 Spring框架 AOP (一)