汇编语言求一组数中的最大值,最小值和总和(以10个数为例)

c语言简单实现:

int a[10]={3,6,5,4,2,9,8,0,1,2}
int max,min,total=a[0];
int n=9;
int i=0;
do{
	i++;
	total=total+a[i];
	if(a[i]>max)
		max=a[i];
	if(a[i]<min)
		min=a[i];	
	n--;
	}while(n>0)

这里使用的是打擂法,设想10个人设擂台比年龄大小,要求找出年龄最大的人。首先第一个人在擂台上守擂台,接下来上来第二个人,如果他的年龄比第一个人大,则第一个人守擂失败下台,第二个人站在擂台上守擂台,那么第二个人就是前两个人中年龄最大的。然后第三个人上台,如果年龄比第二个人大,则擂台上换第三个人,否则第二个人继续守擂台,换第四个人上台比较,以此类推……到最后一个人上台比完的时候,擂台上留下的就是年龄最大的人。

对于本题而言,同时需要求最大值和最小值,就相当于设了最大值,最小值两个擂台,新来的一个数同时进行两次比较,到最后就把最大值和最小值同时求出来了,总和比较好理解,过来一个数总和加上就可以了,到最后总和就是所有数的和。

汇编语言实现(具体解释看注释):

DATAS SEGMENT  
;此处输入数据段代码
   	X DW  3,6,5,4,2,9,8,0,1,2 ;定义一组字类型数
   	MAX DW 0  ;存放最大值
   	MIN DW 0  ;存放最小值
   	TOTAL DW 0  ;存放全体数的和
    
DATAS ENDS ;ends与segment成对出现 

STACKS SEGMENT
    ;此处输入堆栈段代码
STACKS ENDS

CODES SEGMENT
    ASSUME CS:CODES,DS:DATAS,SS:STACKS ;将代码段和CODES段名建立联系,以此类推
START:                    ;起始地址标号,名称可以自己取
    MOV AX,DATAS          ;取DATA段地址给AX
    MOV DS,AX             ;初始化DS段地址,建立CS与DS段联系
    
    MOV DI,OFFSET X
    MOV AX,[DI]
    MOV TOTAL,AX
    MOV MIN,AX
    MOV MAX,AX
    MOV CX,9			  ;设定循环次数
AGAIN:
	INC DI  
	INC DI                ;字型数据指针需要移动两个单位
	MOV AX,[DI]
	ADD TOTAL,AX          ;总和加上当前AX中的值
	MOV DX,TOTAL
	CMP AX,MAX
	JG BRANCH1           ;如果AX>MAX,则跳转标号名称为BRANCH1执行
	JMP BRANCH2			 ;否则,跳转BRANCHE2,不执行BRANCHE1
BRANCH1:
	MOV MAX,AX	         ;把当前最大值存入MAX
BRANCH2:
	CMP AX,MIN
	JLE BRANCH3          
	JMP LOOP1	
BRANCH3:
	MOV MIN,AX	       ;把当前最小值存入MIN,原理与MAX同
LOOP1:	
	LOOP AGAIN	        ;CX大于0就继续循环
	
    MOV AH,4CH          ;结束用户程序,指针返回dos
    INT 21H
CODES ENDS
    END START   ;END为总汇编结束伪指令

调试结果:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
由最终查看相应内存地址的值可见:
最大值为:00 09H
最小值为:00 00H
10个数的总和为:00 28H

  • 20
    点赞
  • 115
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
假设这10个无符号数存储在数组中,可以按照以下步骤求解最大值最小值: 1. 将第一个数存储在累加器中,作为当前最大值最小值。 2. 依次将数组中的其他数与当前最大值最小值比较。 3. 如果当前数比最大值大,将当前数存储到累加器中,作为新的最大值。 4. 如果当前数比最小值小,将当前数存储到累加器中,作为新的最小值。 5. 处理完所有数后,累加器中的值即为最大值最小值。 下面是一个示例的汇编代码,假设这10个无符号数存储在名为 nums 的数组中,每个数占用1个字节的空间: ``` section .data nums db 10, 7, 24, 15, 2, 6, 9, 17, 3, 12 ; 10个无符号数 section .text global _start _start: mov al, byte [nums] ; 将第一个数存储到累加器中 mov bl, byte [nums+1] ; 将下一个数存储到 bl cmp bl, al ; 比较 bl 和 al ja update_max ; 如果 bl 大于 al,跳转到 update_max jb update_min ; 如果 bl 小于 al,跳转到 update_min jmp next_num ; 如果 bl 等于 al,跳转到 next_num update_max: mov al, bl ; 将 bl 存储到累加器中,作为新的最大值 jmp next_num update_min: mov bl, al ; 将 al 存储到 bl 中,作为新的最小值 jmp next_num next_num: add si, 1 ; 数组索引加1 cmp si, 10 ; 比较索引和10 je done ; 如果索引等于10,跳转到 done mov bl, byte [nums+si] ; 将下一个数存储到 bl cmp bl, al ; 比较 bl 和 al ja update_max ; 如果 bl 大于 al,跳转到 update_max jb update_min ; 如果 bl 小于 al,跳转到 update_min jmp next_num done: ; 最大值最小值存储在累加器 al 中,可以将它们存储到其他地方,比如内存或寄存器 ; 这里为了方便直接输出最大值最小值 mov dl, al ; 将最大值存储到 dl 中 add dl, '0' ; 转换为 ASCII 码 mov al, 2 ; 系统调用号,表示输出字符 mov bh, 0 ; 表示输出到标准输出 int 0x80 ; 调用系统调用 mov dl, bl ; 将最小值存储到 dl 中 add dl, '0' ; 转换为 ASCII 码 mov al, 2 ; 系统调用号,表示输出字符 mov bh, 0 ; 表示输出到标准输出 int 0x80 ; 调用系统调用 ; 退出程序 mov eax, 1 ; 系统调用号,表示退出程序 xor ebx, ebx ; 返回值 int 0x80 ; 调用系统调用 ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值