汇编语言实现R进制无符号数的输入/输出

 

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

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

 

ICODE段是数的输入子程序

ContractedBlock.gif ExpandedBlockStart.gif ICODE
  1ICODE    SEGMENT
  2        ASSUME    CS:ICODE
  3        
  4B2X        PROC    FAR
  5        MOV        CX, 16
  6NEXT01:    MOV        AH, 1
  7        INT        21H
  8        CMP        AL, 0DH
  9        JNE        L001
 10        JMP        EXIT01
 11L001:    CMP        AL, 30H
 12        JNB        L002
 13        JMP        ERR01
 14L002:    CMP        AL, 31H
 15        JNA        L003
 16        JMP        ERR01
 17L003:    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
 24EXIT01:    CALL    FAR PTR SHOWXNR
 25        RET
 26ERR01:    CALL    FAR PTR SHOWERR
 27        RET
 28        ; ------ 以上为将输入的16位内的二进制数,并以X进制的形式输出 ------
 29B2X        ENDP
 30
 31O2X        PROC    FAR
 32        MOV        CX, 6
 33NEXT02:    MOV        AH, 1
 34        INT        21H
 35        CMP        AL, 0DH
 36        JNE        L004
 37        JMP        EXIT02
 38L004:    CMP        AL, 30H
 39        JNB        L005
 40        JMP        ERR02
 41L005:    CMP        AL, 37H
 42        JNA        L006
 43        JMP        ERR02
 44L006:    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
 53EXIT02:    CALL    FAR PTR SHOWXNR
 54        RET
 55ERR02:    CALL    FAR PTR SHOWERR
 56        RET
 57        ; ------ 以上为将输入的6位内的八进制数((0~177777)O),并以X进制的形式输出 ------
 58O2X        ENDP
 59
 60D2X        PROC    FAR
 61        MOV        CX, 5
 62NEXT03:    MOV        AH, 1
 63        INT        21H
 64        CMP        AL, 0DH
 65        JNE        L007        
 66        JMP        EXIT03
 67L007:    CMP        AL, 30H
 68        JNB        L008
 69        JMP        ERR03
 70L008:    CMP        AL, 39H
 71        JNA        L009
 72        JMP        ERR03
 73L009:    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
 90EXIT03:    CALL    FAR PTR SHOWXNR
 91        RET
 92ERR03:    CALL    FAR PTR SHOWERR
 93        RET
 94        ; ------ 以上为将输入的5位内的十进制数,并以X进制的形式输出 ------
 95        ; 思路:
 96        ; (0). [RESULT]初值为0
 97        ; (1). [RESULT]乘以10,再加上AL,最后保存到[RESULT]
 98        ; (2). 循环
 99D2X        ENDP
100
101H2X        PROC    FAR
102        MOV        CH, 4
103NEXT04:    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
120L010:    SUB        AL, 7H
121        JMP        L011
122L011:    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
132EXIT04:    CALL    FAR PTR SHOWXNR
133        RET
134ERR04:    CALL    FAR PTR SHOWERR
135        RET
136        ; ------ 以上为将输入的4位内的十六进制数,并以X进制的形式输出 ------
137H2X        ENDP
138ICODE    ENDS


OCODE段是数的输出子程序

; 说明:这里输出RESULT的内容;上述运算的结果保存在RESULT中。

ContractedBlock.gif ExpandedBlockStart.gif OCODE
 1OCODE        SEGMENT
 2            ASSUME    CS:OCODE
 3        
 4SHOWBNR    PROC    FAR
 5            MOV        CX, 16
 6            MOV        AH, 2
 7            MOV        BX, [RESULT]
 8NEXT11:    ROL        BX, 1
 9            MOV        DL, BL
10            AND        DL, 1
11            ADD        DL, 30H
12            INT        21H
13            LOOP    NEXT11
14            ; ------ 以上为用二进制形式输出 ------
15            RET
16SHOWBNR    ENDP
17
18SHOWONR    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            ;
28NEXT12:    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
37SHOWONR    ENDP
38
39SHOWDNR    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
45NEXT131:    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
54NEXT132:    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
63SHOWDNR    ENDP
64
65SHOWHNR    PROC    FAR
66            MOV        AH, 2
67            MOV        CH, 4
68            MOV        BX, [RESULT]
69            MOV        CL, 4
70NEXT14:    ROL        BX, CL
71            MOV        DL, BL
72            AND        DL, 0FH
73            CMP        DL, 9
74            JNA        L11
75            ADD        DL, 7            ; 注意是7;若是小写字母,那就是27H
76L11:        ADD        DL, 30H
77            INT        21H
78            DEC        CH
79            JNE        NEXT14
80            ; ------ 以上为用十六进制形式输出 ------
81            RET
82SHOWHNR    ENDP
83
84OCODE        ENDS
85
86

 

 

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

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

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


附:

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

  2. MASM汇编工具包

--

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

转载于:https://www.cnblogs.com/norx/articles/1383098.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值