汇编语言 | 数组相关应用

该代码段使用汇编语言实现数组操作,包括计算正数累加结果、非负数累加、零正负数及奇偶数个数,并进行冒泡排序找到最小和最大元素。程序提供用户交互菜单供选择不同计算任务。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

对以下数组  10,267,9,0,68,-516,3,85, 0FCH ,101,-32

1)计算数组中正数累加结果保存到变量 result 。

2)计算数组到负数为止的非负数累加结果保存到变量。

3)计算数组中零,正,负数,奇,偶数元素个数分别保存。

4)查找数组中最小元素,绝对值最大元素,排序数组。要求菜单提示选择,调试查看运行结果。

以下是简化段定义下的代码:

.MODEL SMALL
.STACK 4096
.DATA
ARRAY WORD 10,267,9,0,68,-516,3,85,0FCH,101,-32
CHANGELINE DB 13,10,'$'
MENU1 BYTE"Q1 Count the number of positive numbers;",0DH,0AH,'$'
MENU2 BYTE"Q2 Calculates the non-negative number of the array",0DH,0AH,'$'
MENU3 BYTE"Q3 Count the number of zeros, positive number, odd number and even number",0DH,0AH,'$'
MENU4 BYTE"Q4 Find the smallest element, the element with the largest absolute value",0DH,0AH,'$'
MENU5 BYTE"input number:",'$'
MENU6 BYTE"error! input number again:",'$'
RESULT WORD ?
MESS1 BYTE"ANSWER 1 IS: ",'$'
MESS2 BYTE"ANSWER 2 IS: ",'$'
MESS3 BYTE"ANSWER 3  ",0DH,0AH,'$'
MESS3_1 BYTE"ZERO: ",'$'
MESS3_2 BYTE"POSITIVE: ",'$'
MESS3_3 BYTE"NEGATIVE: ",'$'
MESS3_4 BYTE"ODD: ",'$'
MESS3_5 BYTE"EVEN: ",'$'
MESS4 BYTE"ANSWER 4  ",0DH,0AH,'$'
MESS4_1 BYTE"MIN number :",'$'
MESS4_2 BYTE"(absolute value) MAX number :",'$'

.CODE
MAIN PROC FAR
	MOV AX,@DATA
	MOV DS,AX
M:
  CALL MENU
CP:	CMP BL,1
	MOV DX,OFFSET CHANGELINE
    MOV AH,09H;输出换行
    INT 21H
	JE T1
	
	CMP BL,2
	JE T2
	
	
	CMP BL,3
	JE T3
	
	CMP BL,4
	JE T4
	
	MOV DX,OFFSET MENU6
	MOV AH,9H
	INT 21H
	
	MOV DX,OFFSET CHANGELINE
    MOV AH,09H;输出换行
    INT 21H
	MOV DX,OFFSET CHANGELINE
    MOV AH,09H;输出换行
    INT 21H
	JMP M
T1:	CALL RESULT1
	JMP M
T2:CALL RESULT2
	JMP M
T3:CALL RESULT3
	JMP M
T4:CALL RESULT4
	JMP M

	MOV AX,4C00H
	INT 21H
MAIN ENDP

MENU PROC NEAR
	MOV DX,OFFSET MENU1
	MOV AH,9H
	INT 21H
	MOV DX,0
	MOV DX,OFFSET MENU2
	MOV AH,9H
	INT 21H
	MOV DX,OFFSET MENU3
	MOV AH,9H
	INT 21H
	MOV DX,OFFSET MENU4
	MOV AH,9H
	INT 21H
	MOV DX,OFFSET MENU5
	MOV AH,9H
	INT 21H
	
	MOV AH,01H;键盘输入并回显,存在AL
	INT 21H
	MOV BL,AL
	SUB BL,30H
	MOV DL,0DH
	MOV AH,02H
	INT 21H
	MOV DL,0AH
	MOV AH,02H
	INT 21H
RET
MENU ENDP

RESULT1 PROC NEAR
	MOV CX,LENGTHOF ARRAY;保存数据个数
	MOV SI,OFFSET ARRAY;分离出偏移地址
	MOV AX,0
	MOV DX,0
L1: MOV DX,[SI]
	CMP DX,0
	JL FU;小于则跳
	ADD AX,[SI];正数则加
FU: ADD SI, TYPE ARRAY;下一个数据
	LOOP L1
	MOV RESULT,AX;保存到result
	MOV DX,OFFSET MESS1
	MOV AH,9H
	INT 21H
	MOV AX,RESULT
	CALL PRINT
	MOV DX,OFFSET CHANGELINE
    MOV AH,09H;输出换行
    INT 21H
	MOV DX,OFFSET CHANGELINE
    MOV AH,09H
    INT 21H;输出换行
RET
RESULT1 ENDP


PRINT PROC  NEAR   ; 输出带符号的ax
    PUSH AX
    TEST AX,8000H
    JNS P1;sf不为1跳转,即无符号
    PUSH AX
    PUSH DX;保存现场
    MOV AH,2
	MOV DL,'-'
    INT 21H
    POP DX
    POP AX
    NEG  AX;求补
P1:
   CALL PRINT2
   POP  AX
RET
PRINT  ENDP

PRINT2 PROC NEAR; 输出无符号的ax
	PUSH AX;保存现场
	PUSH BX
	PUSH CX
	PUSH DX
	PUSHF;保存标志位
	XOR CX,CX;zf=1
	MOV BX,10
P1:;存余数
	XOR DX,DX;zf=1
	DIV BX
	INC CX
	ADD DX,30H
	PUSH DX ;保存DX入栈,后续
	CMP AX,0
	JNE P1;不等于零则跳转
	MOV AH,2
P2:;输出栈内所存数字
    POP DX
    INT 21H
    LOOP P2
	;MOV DL,32
	;INT 21H
	POPF
	POP DX
	POP CX
	POP BX
	POP AX
RET
PRINT2  ENDP


RESULT2 PROC NEAR
	MOV CX,LENGTHOF ARRAY;保存数据个数
	MOV SI,OFFSET ARRAY;分离出偏移地址
	MOV DX,0
	MOV AX,0
	MOV BX,0
NEXT:
	TEST WORD PTR[SI],8000H;正负,最高位是0还是1,0为正,1为负
	PUSHF
	ADD AX,[SI]
	ADD SI, TYPE ARRAY
	POPF
	LOOPZ NEXT
	JZ L;找到负数
L:  SUB SI,TYPE ARRAY
	SUB AX,[SI];减回一个
	MOV BX,AX
	MOV DX,OFFSET MESS2
	MOV AH,9H
	INT 21H
	MOV AX,BX
	CALL PRINT
	MOV DX,OFFSET CHANGELINE
    MOV AH,09H
    INT 21H;输出换行
	MOV DX,OFFSET CHANGELINE
    MOV AH,09H
    INT 21H;输出换行
RET
RESULT2 ENDP

RESULT3 PROC NEAR;0计数
	MOV CX,LENGTHOF ARRAY;保存数据个数
	MOV SI,OFFSET ARRAY;分离出偏移地址
	MOV AX,0
	MOV DX,0
NEXT1:;统计0
	MOV AX,[SI]
	CMP AX,0
	JE L1
	JMP L2
L1: INC DL
L2:	ADD SI,TYPE ARRAY;下一个元素
	LOOP NEXT1
	MOV BL,DL
	MOV DX,OFFSET MESS3
	MOV AH,9H
	INT 21H
	
	MOV DX,OFFSET MESS3_1
	MOV AH,9H
	INT 21H
	MOV DL,BL
	ADD DL,30H
	MOV AH,02H
	INT 21H
	MOV DX,OFFSET CHANGELINE
    MOV AH,09H
    INT 21H;输出换行
	MOV CX,LENGTHOF ARRAY;保存数据个数
	MOV SI,OFFSET ARRAY;分离出偏移地址
	MOV AX,0
	MOV DX,0
	MOV BX,0
NEXT2:;统计正负
	MOV AX,[SI]
	CMP AX,0
	JG L21
	CMP AX,0
	JL L22
	JMP D
L21: INC DL;正数
	JMP D
L22: INC DH;负数
D:	ADD SI,TYPE ARRAY
	LOOP NEXT2

	MOV BX,DX
	MOV DX,OFFSET MESS3_2
	MOV AH,9H
	INT 21H
	MOV DL,BL
	ADD DL,30H
	MOV AH,02H
	INT 21H
	MOV DX,OFFSET CHANGELINE
    MOV AH,09H
    INT 21H;输出换行
	MOV DX,OFFSET MESS3_3
	MOV AH,9H
	INT 21H
	MOV DL,BH
	ADD DL,30H
	MOV AH,02H
	INT 21H
	MOV DX,OFFSET CHANGELINE
    MOV AH,09H
    INT 21H;输出换行
	MOV CX,LENGTHOF ARRAY;保存数据个数
	MOV SI,OFFSET ARRAY;分离出偏移地址
	MOV AX,0
	MOV DX,0
NEXT3:;统计奇偶
	TEST WORD PTR[SI],1
	JNZ L31;奇数跳
	INC DL;
	JMP L32;偶数跳
L31:INC DH
L32:ADD SI,TYPE ARRAY
	LOOP NEXT3
	MOV BX,DX
	MOV DX,OFFSET MESS3_4
	MOV AH,9H
	INT 21H
	MOV DL,BH
	ADD DL,30H
	MOV AH,2H
	INT 21H
	MOV DX,OFFSET CHANGELINE
    MOV AH,09H
    INT 21H;输出换行
	MOV DX,OFFSET MESS3_5
	MOV AH,9H
	INT 21H
	MOV DL,BL
	ADD DL,30H
	MOV AH,2H
	INT 21H
	MOV DX,OFFSET CHANGELINE
    MOV AH,09H
    INT 21H;输出换行
	MOV DX,OFFSET CHANGELINE
    MOV AH,09H
    INT 21H;输出换行
RET
RESULT3 ENDP
	
	

RESULT4 PROC NEAR	
	;冒泡排序
	MOV CX,LENGTHOF ARRAY;保存数据个数
	DEC CX
L1:
	MOV DI,CX
	MOV BX,0
L2:
	MOV AX,ARRAY[BX]
	CMP AX,ARRAY[BX+2]
	JLE L3;小于等于
	XCHG AX,ARRAY[BX+2]
	MOV ARRAY[BX],AX
L3:
	ADD BX,2
	LOOP L2
	MOV CX,DI
	LOOP L1
	

	MOV SI,OFFSET ARRAY
	MOV CX,LENGTHOF ARRAY
	DEC CX
	MOV BX,0
	MOV AX,[SI]
	MOV BX,AX
	MOV DX,OFFSET MESS4
	MOV AH,9H
	INT 21H
	MOV DX,OFFSET MESS4_1
	MOV AH,9H
	INT 21H
	MOV AX,BX
	CALL PRINT                                                                                                                                                                                         
	NEG AX
NEXT:
	ADD SI,2
	MOV CX,LENGTHOF ARRAY
	DEC CX
	CMP AX,[SI]
	JL L4
	MOV BX,0
	JMP L5
L4: 
	ADD BX,2;
	LOOP L4
L5:
	MOV SI,OFFSET ARRAY
	ADD SI,BX
	MOV AX,[SI]
	CMP AX,0
	JL AB
	JMP CON
AB:	NEG AX;	绝对值
CON:MOV BX,AX
	MOV DX,OFFSET CHANGELINE
    MOV AH,09H
    INT 21H;输出换行
	MOV DX,OFFSET MESS4_2
	MOV AH,9H
	INT 21H
	MOV AX,BX
	CALL PRINT
	MOV DX,OFFSET CHANGELINE
    MOV AH,09H
    INT 21H;输出换行
	MOV DX,OFFSET CHANGELINE
    MOV AH,09H
    INT 21H;输出换行
RET
RESULT4 ENDP   
END

欢迎批评指正

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值