📄 4123.lst
字号:
Turbo Assembler Version 4.1 06/12/10 22:11:01 Page 1
F:\study\汇编\4123.ASM
1 ;4-1,2,3
2 ;把地址偏移量为100H单元开始的256个单元分别写入00H,01H,...,FFH数据,
3 ;并统计0、正数、负数的个数,把统计结果送入上述数据块之后的3个单元中,
4 ;用DOS功能调用显示数据块各单元内容。
5
6 0000 DATA SEGMENT
7 ORG 100H ;数据块在段中的偏移地址为100H
8 0100 0100*(??) BUF1 DB 256 DUP(?) ;buf1的256个单元存放数据
9 =0100 COUNT EQU $-BUF1 ;数据块长度为256
10 0200 03*(??) BUF2 DB 3 DUP (?) ;BUF2的3个单元存放统计结果
11 0203 DATA ENDS
12
13 0000 CODE SEGMENT
14 ASSUME CS:CODE,DS:DATA
15 0000 B8 0000s START: MOV AX,DATA
16 0003 8E D8 MOV DS,AX
17 0005 BE 0100r LEA SI,BUF1 ;si指向buf1的首地址
18 0008 B9 0100 MOV CX,COUNT ;数据块的长度为256
19 000B 32 C0 XOR AL,AL ;al清零
20 000D 33 DB XOR BX,BX ;bx清零
21 000F 32 F6 XOR DH,DH ;dh清零
22 0011 88 04 NEXT1: MOV [SI],AL ;将AL的数据(00H~FFH)存入SI所指向的内存单元中
23 0013 8A 24 MOV AH,[SI]
24 0015 80 FC 00 CMP AH,0
25 0018 74 07 JZ ZERO ;若ZF=1,则该数为0,转至zero,DH加1
26 001A 78 0A JS NEGATIVE ;若SF=1,则该数为负数,则转至NEGATIVE,BH加1
27 001C FE C3 INC BL ;若SF=0,则该数为正数,则BL加1,即正数的个数加1
28 001E EB 0B 90 JMP NEXT2
29 0021 FE C6 ZERO: INC DH ;0的个数加1
30 0023 EB 06 90 JMP NEXT2
31 0026 FE C7 NEGATIVE: INC BH ;负数的个数加1
32 0028 EB 01 90 JMP NEXT2
33 002B FE C0 NEXT2: INC AL ;al加1
34 002D 46 INC SI ;si指向下一单元
35 002E E2 E1 LOOP NEXT1
36 0030 88 34 MOV [SI],DH ;在数据块后存入0的总个数
37 0032 46 INC SI
38 0033 88 1C MOV [SI],BL ;在0的总个数后存入正数的总个数
39 0035 46 INC SI
40 0036 88 3C MOV [SI],BH ;在正数的总个数后存入负数的总个数
41 0038 BE 0100r LEA SI,BUF1
42 003B B9 0103 MOV CX,COUNT+3 ;数据块的长度是259
43 003E B7 10 LINE: MOV BH,16 ;每输出16个数回车换行
44 0040 8A 04 NEXT3: MOV AL,[SI]
45 0042 8A D8 MOV BL,AL
46 0044 D0 E8 SHR AL,1 ;将al中存的值逻辑左移4,则al中的值是bl的高四位
47 0046 D0 E8 SHR AL,1
48 0048 D0 E8 SHR AL,1
49 004A D0 E8 SHR AL,1
50 004C E8 0022 CALL EXCHANGE ;将al中的值转换为ASCII码
51 004F 8A C3 MOV AL,BL
52 0051 24 0F AND AL,0FH ;al中的值是bl的低四位
53 0053 E8 001B CALL EXCHANGE ;将其转换为ASCII码
54 0056 B0 20 MOV AL,20H ;输出空格
55 0058 E8 0025 CALL SHOW
56 005B 46 INC SI ;si指向下一单元
57 005C E2 03 LOOP NEXT4
Turbo Assembler Version 4.1 06/12/10 22:11:01 Page 2
F:\study\汇编\4123.ASM
58 005E EB 27 90 JMP STOP
59 0061 FE CF NEXT4: DEC BH ;bh减1
60 0063 75 DB JNZ NEXT3
61 0065 B0 0D MOV AL,0DH ;回车
62 0067 E8 0016 CALL SHOW
63 006A B0 0A MOV AL,0AH ;换行
64 006C E8 0011 CALL SHOW
65 006F EB CD JMP LINE
66
67 0071 EXCHANGE PROC NEAR ;将al中的值转换为ASCII码
68 0071 3C 0A CMP AL,0AH
69 0073 78 02 JS DONE
70 0075 04 07 ADD AL,7
71 0077 04 30 DONE: ADD AL,30H
72 0079 8A D0 MOV DL,AL
73 007B B4 02 MOV AH,02H
74 007D CD 21 INT 21H
75 007F C3 RET
76 0080 EXCHANGE ENDP
77
78 0080 SHOW PROC NEAR ;显示
79 0080 8A D0 MOV DL,AL
80 0082 B4 02 MOV AH,02H
81 0084 CD 21 INT 21H
82 0086 C3 RET
83 0087 SHOW ENDP
84
85 0087 B4 4C STOP: MOV AH,4CH ;结束
86 0089 CD 21 INT 21H
87 008B CODE ENDS
88 END START
Turbo Assembler Version 4.1 06/12/10 22:11:01 Page 3
Symbol Table
Symbol Name Type Value Cref (defined at #)
??DATE Text "06/12/10"
??FILENAME Text "4123 "
??TIME Text "22:11:01"
??VERSION Number 040A
@CPU Text 0101H
@CURSEG Text CODE #6 #13
@FILENAME Text 4123
@WORDSIZE Text 2 #6 #13
BUF1 Byte DATA:0100 #8 9 17 41
BUF2 Byte DATA:0200 #10
COUNT Number 0100 #9 18 42
DONE Near CODE:0077 69 #71
EXCHANGE Near CODE:0071 50 53 #67
LINE Near CODE:003E #43 65
NEGATIVE Near CODE:0026 26 #31
NEXT1 Near CODE:0011 #22 35
NEXT2 Near CODE:002B 28 30 32 #33
NEXT3 Near CODE:0040 #44 60
NEXT4 Near CODE:0061 57 #59
SHOW Near CODE:0080 55 62 64 #78
START Near CODE:0000 #15 88
STOP Near CODE:0087 58 #85
ZERO Near CODE:0021 25 #29
Groups & Segments Bit Size Align Combine Class Cref (defined at #)
CODE 16 008B Para none #13 14
DATA 16 0203 Para none #6 14 15
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -