coreBugZJ

此 blog 已弃。

微机实验 MASM 汇编实现进制转换

        电子系同学 YLY 的微机实验,x86 MASM 汇编,DOS 21H 中断,输入一个 4 位的十进制数字,输出二进制和十六进制。

        程序有问题,让我帮忙看看,两人却几乎同时发现错误所在,囧。。。

        我干脆把它修改正确了,放上来,我修改的地方都做了说明。

        我写汇编是用 NASM 的,对 MASM 不熟,尽管我也是从 MASM 开始学习汇编的。所以程序中的代码我不完全会写,但是修改程序逻辑还是可以的。


  1DATA    SEGMENT
  2INF1 DB "PLEASE INPUT A NUMBER: $ ";提示语言
  3INF2 DB "OH NO. THIS IS NOT ALLOWED"
  4INPUT     DB 4 DUP(0)
  5RESULT  DW ?
  6SIXTEEN DB 4 DUP(0)
  7DATA    ENDS
  8
  9SSEG SEGMENT STACK 'STACK'
 10        DW 100 DUP(?)
 11SSEG ENDS
 12
 13CODE    SEGMENT
 14    ASSUME DS:DATA, CS:CODE, SS:SSEG
 15
 16START:  MOV AX,DATA
 17    MOV DS,AX
 18    LEA DX,INF1
 19    LEA SI,INPUT
 20    MOV AH,9
 21        INT 21H
 22    MOV AX,0
 23    MOV CX,4
 24
 25JUDGE:  MOV AH,1  ;判断是否符合要求
 26    INT 21H
 27    CMP AL,30H
 28    JB JUDGE
 29    CMP AL,39H
 30    JA JUDGE
 31    MOV [SI],AL
 32    INC SI
 33    LOOP JUDGE
 34    MOV CX,4
 35    MOV DL,' '
 36    MOV AH,02H
 37    INT 21H
 38    XOR AX,AX
 39    MOV BX,0              
 40    LEA SI,INPUT
 41
 42AGAIN:    ADD AX,AX    
 43    MOV BX,AX
 44    ADD AX,AX
 45    ADD AX,AX
 46    ADD AX,BX
 47    MOV BH,0
 48    MOV BL,[SI] 
 49    SUB BL,30H
 50    ADD AX,BX ;部分和计算
 51    INC SI
 52    LOOP AGAIN
 53    MOV CX,16
 54    MOV BX,AX
 55    ; MOV DX,AX ; coreBugZJ delete
 56    push ax     ; coreBugZJ insert
 57
 58PRINT:    ROL BX,1
 59    JC BIG
 60    MOV DL,30H
 61    MOV AH,02H
 62    INT 21H
 63    LOOP PRINT
 64    JMP AD
 65BIG:    MOV DL,31H
 66    MOV AH,02H
 67    INT 21H
 68    LOOP PRINT
 69 AD:    MOV DL,' '
 70    MOV AH,02H
 71    INT 21H
 72
 73NEXT:   ; MOV AX,DX ; coreBugZJ delete
 74    pop ax      ; coreBugZJ insert
 75    mov dx, ax  ; coreBugZJ insert
 76    MOV DI,OFFSET SIXTEEN
 77    MOV BX,AX
 78    push ax     ; coreBugZJ insert
 79
 80    ; coreBugZJ  NEXT4-NEXT3-NEXT2-NEXT1  <<==  NEXT1-NEXT2-NEXT3-NEXT4
 81
 82    AND BH,0F0H
 83    MOV CL,4
 84    SHR BH,CL
 85    ADD BH,30H
 86    CMP BH,3AH
 87    JB NEXT4
 88    ADD BH,07H
 89NEXT4:  MOV DL,BH
 90    MOV AH,02H
 91    INT 21H
 92
 93    AND DH,0FH
 94    ADD DH,30H
 95    CMP DH,3AH
 96    JB NEXT3
 97    ADD DH,07H
 98NEXT3:    ; MOV DL,AH ; coreBugZJ delete
 99    mov dl, dh  ; coreBugZJ insert
100    MOV AH,2
101    INT 21H
102
103    AND BL,0F0H
104    MOV CL,4
105    SHR BL,CL
106    ADD BL,30H
107    CMP BL,3AH
108    JB NEXT2
109    ADD BL,07H
110NEXT2: MOV DL,BL
111    MOV AH,2
112    INT 21H
113
114    pop ax ; coreBugZJ insert
115    AND AL,0FH
116    ADD AL,30H
117    CMP AL,3AH
118    JB NEXT1
119    ADD AL,07H
120NEXT1: MOV DL,AL
121    MOV AH,2
122    INT 21H 
123
124
125EXIT:    MOV AH,4CH
126    INT 21H 
127CODE ENDS
128    END START
129






posted on 2011-09-27 22:36 coreBugZJ 阅读(224) 评论(0)  编辑 收藏 引用 所属分类: Assemble课内作业


只有注册用户登录后才能发表评论。
【推荐】超50万行VC++源码: 大型组态工控、电力仿真CAD与GIS源码库
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理