我认为,学习一门计算机编程语言,第一件事是要掌握如何输入和输出;汇编语言也不例外。通过编制“R进制无符号数的输入/输出”程序,能练习汇编语言中的“INT 12H”中断的1、2、9、1AH号功能,ADD/SUB/MUL/DIV等算术运算指令,以及各种跳转指令的运用,这对汇编语言的快速入门有很大帮助。

  “R进制无符号数的输入/输出”程序将实现这么一个功能:用户输入R进制数(R=2、8、10、16,下同)后程序自动输出相应的R进制数。下面,是该程序的输入子程序和输出子程序。


ICODE段是数的输入子程序



ICODE   
  1
ICODE    SEGMENT
  2
        ASSUME    CS:ICODE
  3
        
  4
B2X        PROC    FAR
  5
        MOV        CX, 16
  6
NEXT01:    MOV        AH, 1
  7
        INT        21H
  8
        CMP        AL, 0DH
  9
        JNE        L001
 10
        JMP        EXIT01
 11
L001:    CMP        AL, 30H
 12
        JNB        L002
 13
        JMP        ERR01
 14
L002:    CMP        AL, 31H
 15
        JNA        L003
 16
        JMP        ERR01
 17
L003:    SUB        AL, 30H
 18
        MOV        DX, [RESULT]        ;
 19
        SHL        DX, 1
 20
        XOR        AH, AH
 21
        ADD        DX, AX
 22
        MOV        [RESULT], DX        
 23
        LOOP    NEXT01
 24
EXIT01:    CALL    FAR PTR SHOWXNR
 25
        RET
 26
ERR01:    CALL    FAR PTR SHOWERR
 27
        RET
 28
        ; ------ 以上为将输入的16位内的二进制数,并以X进制的形式输出 ------
 29
B2X        ENDP
 30

 31
O2X        PROC    FAR
 32
        MOV        CX, 6
 33
NEXT02:    MOV        AH, 1
 34
        INT        21H
 35
        CMP        AL, 0DH
 36
        JNE        L004
 37
        JMP        EXIT02
 38
L004:    CMP        AL, 30H
 39
        JNB        L005
 40
        JMP        ERR02
 41
L005:    CMP        AL, 37H
 42
        JNA        L006
 43
        JMP        ERR02
 44
L006:    SUB        AL, 30H
 45
        MOV        DL, AL
 46
        XOR        DH, DH
 47
        MOV        AX, [RESULT]
 48
        MOV        CL, 3
 49
        SHL        AX, CL
 50
        ADD        AX, DX
 51
        MOV        [RESULT], AX
 52
        LOOP    NEXT02
 53
EXIT02:    CALL    FAR PTR SHOWXNR
 54
        RET
 55
ERR02:    CALL    FAR PTR SHOWERR
 56
        RET
 57
        ; ------ 以上为将输入的6位内的八进制数((0~177777)O),并以X进制的形式输出 ------
 58
O2X        ENDP
 59

 60
D2X        PROC    FAR
 61
        MOV        CX, 5
 62
NEXT03:    MOV        AH, 1
 63
        INT        21H
 64
        CMP        AL, 0DH
 65
        JNE        L007        
 66
        JMP        EXIT03
 67
L007:    CMP        AL, 30H
 68
        JNB        L008
 69
        JMP        ERR03
 70
L008:    CMP        AL, 39H
 71
        JNA        L009
 72
        JMP        ERR03
 73
L009:    XOR        AH, AH
 74
        SUB        AL, 30H
 75
        MOV        DX, AX
 76
        MOV        AX, [RESULT]    ; 这里先把[RESULT]的值取出
 77
        MOV        BH, AH            ; 转移[RESULT]的高8位,这样处理使程序可适用0~65535的数,不做此处理则只能适用0~2559的数
 78
        MOV        BL, 10
 79
        MUL        BL                ; 将[Result]的低8位乘以10
 80
        ADD        DX, AX            ; 与新输入的低位相加
 81
        MOV        AL, BH            ; 恢复高8位
 82
        MUL        BL                ; 将[Result]的高8位乘以10
 83
        PUSH    CX                ;
 84
        MOV        CL, 8            ; 将高8位移位复原到正常位序
 85
        SHL        AX, CL            ;
 86
        ADD        AX, DX            ; 与新输入的低位相加
 87
        POP        CX                ;    
 88
        MOV        [RESULT], AX    ; 将结果保存到[RESULT]
 89
        LOOP    NEXT03
 90
EXIT03:    CALL    FAR PTR SHOWXNR
 91
        RET
 92
ERR03:    CALL    FAR PTR SHOWERR
 93
        RET
 94
        ; ------ 以上为将输入的5位内的十进制数,并以X进制的形式输出 ------
 95
        ; 思路:
 96
        ; (0). [RESULT]初值为0
 97
        ; (1). [RESULT]乘以10,再加上AL,最后保存到[RESULT]
 98
        ; (2). 循环
 99
D2X        ENDP
100

101
H2X        PROC    FAR
102
        MOV        CH, 4
103
NEXT04:    MOV        AH, 1
104
        INT        21H
105
        CMP        AL, 0DH
106
        JE        EXIT04
107
        CMP        AL, 30H
108
        JB        ERR04
109
        CMP        AL, 39H
110
        JBE        L011
111
        CMP        AL, 41H
112
        JB        ERR04
113
        CMP        AL, 46H
114
        JBE        L010
115
        CMP        AL, 61H
116
        JB        ERR04
117
        CMP        AL, 66H
118
        JA        ERR04
119
        SUB        AL, 20H
120
L010:    SUB        AL, 7H
121
        JMP        L011
122
L011:    SUB        AL, 30H
123
        MOV        DL, AL
124
        XOR        DH, DH
125
        MOV        AX, [RESULT]
126
        MOV        CL, 4
127
        SHL        AX, CL;
128
        ADD        AX, DX
129
        MOV        [RESULT], AX
130
        DEC        CH
131
        JNE        NEXT04
132
EXIT04:    CALL    FAR PTR SHOWXNR
133
        RET
134
ERR04:    CALL    FAR PTR SHOWERR
135
        RET
136
        ; ------ 以上为将输入的4位内的十六进制数,并以X进制的形式输出 ------
137
H2X        ENDP
138
ICODE    ENDS  

OCODE段是数的输出子程序 
; 说明:这里输出RESULT的内容;上述运算的结果保存在RESULT中。
     OCODE    1
OCODE        SEGMENT
 2
            ASSUME    CS:OCODE
 3
        
 4
SHOWBNR    PROC    FAR
 5
            MOV        CX, 16
 6
            MOV        AH, 2
 7
            MOV        BX, [RESULT]
 8
NEXT11:    ROL        BX, 1
 9
            MOV        DL, BL
10
            AND        DL, 1
11
            ADD        DL, 30H
12
            INT        21H
13
            LOOP    NEXT11
14
            ; ------ 以上为用二进制形式输出 ------
15
            RET
16
SHOWBNR    ENDP
17

18
SHOWONR    PROC    FAR
19
            MOV        AH, 2
20
            MOV        BX, [RESULT]
21
            ROL        BX, 1            ;
22
            MOV        DL, BL
23
            AND        DL, 1
24
            ADD        DL, 30H
25
            INT        21H;
26
            MOV        CH, 5            ;
27
            MOV        CL, 3            ;
28
NEXT12:    ROL        BX, CL
29
            MOV        DL, BL
30
            AND        DL, 7
31
            ADD        DL, 30H
32
            INT        21H
33
            DEC        CH                ;
34
            JNE        NEXT12
35
            ; ------ 以上为用八进制形式输出 ------
36
            RET
37
SHOWONR    ENDP
38

39
SHOWDNR    PROC    FAR                ; 不能直接用AX除以BL(BL==10),
40
                                ; 因为AX==65535时AL无法存储6553,
41
                                ; 会出现除以0错误;故要用DX:AX
42
                                ; 除以BX(BX==10)
43
            MOV        AX, [RESULT]
44
            XOR        BP, BP
45
NEXT131:    XOR        DX, DX
46
            MOV        BX, 10
47
            DIV        BX
48
            PUSH    DX                ; 这里不能PUSH DL,否则会有警告,
49
                                    ; 而且DL也不会被进栈(于是所显示的
50
                                    ; 十进制数只有第1位是正确的)。
51
            INC        BP
52
            CMP        AX, 0
53
            JNE        NEXT131
54
NEXT132:    POP        DX
55
            MOV        AH, 2
56
            ADD        DL, 30H
57
            INT        21H
58
            DEC        BP
59
            CMP        BP, 0
60
            JNE        NEXT132
61
            ; ------以上为用十进制形式输出 ------
62
            RET
63
SHOWDNR    ENDP
64

65
SHOWHNR    PROC    FAR
66
            MOV        AH, 2
67
            MOV        CH, 4
68
            MOV        BX, [RESULT]
69
            MOV        CL, 4
70
NEXT14:    ROL        BX, CL
71
            MOV        DL, BL
72
            AND        DL, 0FH
73
            CMP        DL, 9
74
            JNA        L11
75
            ADD        DL, 7            ; 注意是7;若是小写字母,那就是27H
76
L11:        ADD        DL, 30H
77
            INT        21H
78
            DEC        CH
79
            JNE        NEXT14
80
            ; ------ 以上为用十六进制形式输出 ------
81
            RET
82
SHOWHNR    ENDP
83

84
OCODE        ENDS
85

86

 

 

  读者可以参考上述方法自行编制自己的R进制数的输入、输出程序。

  或者,我已将编制好的程序源代码和相应的可执行程序打包上传至 “附件” ,读者可自行下载。源码已在MASM5.0上测试通过,暂无发现BUG;如有问题,欢迎与我联系。谢谢。

  声明:本文及其源码乃本人原创,欢迎学习交流,谢绝未经同意的商业使用;本人将保留一切“知识产权”上的权利。


附:

  1. R进制数的输入/输出程序

  2. MASM汇编工具包


--


14:22:03,2009年2月3日