电子系同学 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