2 DW 40H DUP(?)
3 TOP LABEL WORD
4 STA ENDS
5
6 DATA SEGMENT
7
8
9 ARY DW 5 ,6B3DH,0FFFFH, 2 , 40000 , 1 ; 存入ARY数组中的数分别为数组的大小,相应的元素(有符号数)
10
11 DATA ENDS
12
13 CODE SEGMENT
14 ASSUME CS: CODE, SS: STA, DS: DATA
15
16 MAIN PROC FAR
17 MOV AX,STA
18 MOV SS,AX
19 LEA SP,TOP
20 MOV AX,DATA
21 MOV DS,AX
22
23
24
25 MOV SI, 0
26 MOV BP,ARY[SI]
27 L1: ADD SI, 2
28 MOV BX,ARY[SI]
29 OR BX,BX
30 JNS L20 ; 符号的判断,若sp为0时转移(为正数)-------------------1
31
32 MOV DL, ' - ' ; 若为负数(最高位为1)
33 MOV AH, 2
34 INT 21H
35 NEG BX ; 求其补数
36
37
38
39 L20:
40
41 MOV AX,BX
42 MOV CX, 0
43
44 L30: XOR DX,DX
45 MOV BX, 10
46 DIV BX
47 PUSH DX ; 得出的十进制数的每一位进栈
48 INC CX
49 CMP AX, 0
50 JNE L30
51
52
53 L4: POP DX
54 ADD DL,30H
55 MOV AH, 2
56 INT 21H
57 LOOP L4 ; 出栈,输出十进制形式的元素
58
59
60
61 MOV DL, ' '
62 MOV AH, 2
63 INT 21H
64 DEC BP ; 前面用BP记录下数组的大小
65 JNE L1
66
67
68
69 MOV AH,4CH
70 INT 21H
71 MAIN ENDP
72 CODE ENDS
73 END MAIN
74
同理:可以进行功能的拓展,例如通过键盘以任何进制形式输入有限个数组元素,以十进制,十六进制,二进制等形式输出 (一定要谨记,机器中存储数据只有二进制,只是通过另一种形式输出结果而已)。
我遇到的困难,主要输寄存器数量的不足,在存储数组大小的寄存器中我用了BP(基址指针),能用,但不知道这样是否合理,嘻嘻。
学到的知识:
1 数据段的应用,要赋值,一定要记住!
2 寄存器的间接寻址方式,在16位寻址时可用的寄存器是BX,BP,SI,DI,其形式有
MOV AX,COUNT[SI]
MOV AX,[COUNT+SI]
3 判断跳转语句(转移指令)
JMP 标号 --无条件转移指令
JXX 标号 --条件转移指令
one,根据PSW的状态来决定转移(CF,OF,XF,ZF)
JC(CF为1时转移) JNC (CF为0时转移)
其它同理
----------- 1行用了JNS来判断最高位的符号!
two,根据比较两个无符号数,根据其大小关系来转移
JA 大于 JB 小于 JE 等于 N非 JAE 大于等于
根据比较两个有符号数大小转移
JG JL JE N
根据CX的值转移
JCXZ 标号