1 STA SEGMENT STACK
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 标号

   

posted on 2010-04-17 13:27  KuSiuloong  阅读(490)  评论(0编辑  收藏  举报