📄 平均值.lst
字号:
Turbo Assembler Version 4.1 08/05/15 22:17:55 Page 1
C:\DOCUME~1\ADMINI~1\MYDOCU~1\汇编程序\平均值.ASM
1 0000 DATA SEGMENT
2 0000 01 05 04 00 07 09 02+ BUF DB 1,5,4,0,7,9,2,6,8,3
3 06 08 03
4 =0009 COUNT EQU $-BUF-1
5 000A DATA ENDS
6 0000 CODE SEGMENT
7 ASSUME CS:CODE,DS:DATA
8 0000 B8 0000s START: MOV AX,DATA
9 0003 8E D8 MOV DS,AX
10 ;--------------------------------------------------------数据处理部分--------
11 0005 B3 00 MOV BL,0 ;置子程序参数(0是查找最小数,否则查找最大数)
12 0007 B9 0009 MOV CX,COUNT ;置子程序参数(第一次循环查找COUNT次)
13 000A E8 004B CALL FIND ;查找最小数地址
14 000D E8 0036 CALL DEL ;删除最小数
15 0010 B3 01 MOV BL,1
16 0012 49 DEC CX ;置子程序参数(第二次循环查找COUNT-1次)
17 0013 E8 0042 CALL FIND ;查找最大数地址
18 0016 E8 002D CALL DEL ;删除最大数
19 ;---------------------------------------------------------求和部分----------
20 0019 49 DEC CX ;置循环求和次数
21 001A BE 0000r LEA SI,BUF
22 001D 8A 04 MOV AL,[SI]
23 001F 46 NUM: INC SI
24 0020 02 04 ADD AL,[SI] ;循环求和
25 0022 E2 FB LOOP NUM
26 ;----------------------------------------------------------求平均值部分------
27 0024 B4 00 MOV AH,0 ;扩展为16位AX
28 0026 B3 08 MOV BL,COUNT-1 ;置除数值(08H)
29 0028 F6 F3 DIV BL ;求平均值:AX/BL 24H/08H
30 002A 80 FC 00 CMP AH,0 ;若余数为0
31 002D 74 10 JZ NEXT ;则将商直接存入存储器单元
32 002F 50 PUSH AX ;否则保存商
33 0030 8A C4 MOV AL,AH ;将余数存放AL
34 0032 B2 0A MOV DL,0AH ;置乘数为0AH
35 0034 F6 E2 MUL DL ;AL*DL=AX
36 0036 F6 F3 DIV BL ;AX/BL 28H/08H
37 0038 3C 05 CMP AL,5 ;若商小于5
38 003A 72 03 JB NEXT ;则直接存入存储器单元
39 003C 58 POP AX
40 003D FE C0 INC AL ;否则将商加1
41 003F 88 44 01 NEXT: MOV [SI+1],AL ;保存四舍五入后的平均值
42 ;----------------------------------------------------------------------------------
43 0042 B4 4C MOV AH,4CH
44 0044 CD 21 INT 21H ;程序退出
45 ;==============================================删除地址DX对应的存储器数据子程序
46 0046 DEL PROC NEAR
47 0046 51 PUSH CX
48 0047 2B CA SUB CX,DX ;置循环次数
49 0049 8B F2 MOV SI,DX
50 004B ROP:
51 004B 8A 5C 01 MOV BL,[SI+1] ;目标数据的后一个数据存入bl
52 004E 88 1C MOV [SI],BL ;将后一个数据移到前一个数据
53 0050 46 INC SI ;修改地址
54 0051 E2 F8 LOOP ROP
55 0053 C6 04 00 MOV BYTE PTR[SI],0
56 0056 59 POP CX
57 0057 C3 RET
Turbo Assembler Version 4.1 08/05/15 22:17:55 Page 2
C:\DOCUME~1\ADMINI~1\MYDOCU~1\汇编程序\平均值.ASM
58 0058 DEL ENDP
59 ;==============================查找数组中指定数据地址存入DX(最大数,最小数)子程序
60 0058 FIND PROC NEAR
61 0058 51 PUSH CX
62 0059 BE 0000r LEA SI,BUF
63 005C 8A 04 MOV AL,[SI] ;取第一个数
64 005E 46 INC SI
65 005F 80 FB 00 CMP BL,0 ;若为0,则为查找最小数,否则为查找最大数
66 0062 74 0E JZ SMALL1
67 0064 3A 04 BEGIN: CMP AL,[SI] ;查找最大数,第一个数与第二数比较
68 0066 73 04 JAE TOP ;若大于等于则转
69 0068 8A 04 MOV AL,[SI] ;记录最大值
70 006A 8B D6 MOV DX,SI ;否则将最大数地址保存在DX中
71 006C 46 TOP: INC SI
72 006D E2 F5 LOOP BEGIN
73 006F EB 0C 90 JMP EXIT
74 0072 3A 04 SMALL1: CMP AL,[SI] ;查找最小数,第一个数与第二数比较
75 0074 76 04 JBE TOP1 ;若小于等于则转
76 0076 8A 04 MOV AL,[SI]
77 0078 8B D6 MOV DX,SI ;否则将最小数地址保存在DX中
78 007A 46 TOP1: INC SI
79 007B E2 F5 LOOP SMALL1
80 007D 59 EXIT: POP CX
81 007E C3 RET
82 007F FIND ENDP
83 007F CODE ENDS
84 END START
Turbo Assembler Version 4.1 08/05/15 22:17:55 Page 3
Symbol Table
Symbol Name Type Value Cref (defined at #)
??DATE Text "08/05/15"
??FILENAME Text "平均值 "
??TIME Text "22:17:55"
??VERSION Number 040A
@CPU Text 0101H
@CURSEG Text CODE #1 #6
@FILENAME Text 平均值
@WORDSIZE Text 2 #1 #6
BEGIN Near CODE:0064 #67 72
BUF Byte DATA:0000 #2 4 21 62
COUNT Number 0009 #4 12 28
DEL Near CODE:0046 14 18 #46
EXIT Near CODE:007D 73 #80
FIND Near CODE:0058 13 17 #60
NEXT Near CODE:003F 31 38 #41
NUM Near CODE:001F #23 25
ROP Near CODE:004B #50 54
SMALL1 Near CODE:0072 66 #74 79
START Near CODE:0000 #8 84
TOP Near CODE:006C 68 #71
TOP1 Near CODE:007A 75 #78
Groups & Segments Bit Size Align Combine Class Cref (defined at #)
CODE 16 007F Para none #6 7
DATA 16 000A Para none #1 7 8
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -