-
Notifications
You must be signed in to change notification settings - Fork 0
/
POPCOUNT.ASM
120 lines (96 loc) · 2.11 KB
/
POPCOUNT.ASM
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
NAME POPCOUNT
TITLE POPCOUNT -- Count the number of one bits of standard input
BUFSIZ EQU 512
STDERR EQU 2
STDOUT EQU 1
CODE SEGMENT
ASSUME ES:CODE, CS:CODE, SS:CODE, DS:CODE
ORG 0100H
START: XOR CX, CX
MOV DX, CX
NEXT: CALL GETCH
MOV BL, BYTE PTR [BX+POPTAB]
ADD CX, BX
ADC DX, +0
JMP SHORT NEXT
GETCH: PUSH CX
PUSH DX
MOV SI, BUFCUR
CMP SI, BUFLEN
JNE CURCH
MOV AH, 3FH
MOV CX, BUFSIZ
MOV DX, OFFSET BUFPTR
XOR BX, BX
INT 21H
JC ERROR
OR AX, AX
JZ FINISH
MOV BUFLEN, AX
XOR SI, SI
CURCH: XOR BH, BH
MOV BL, BYTE PTR [SI+BUFPTR]
INC SI
MOV BUFCUR, SI
POP DX
POP CX
RET
ERROR: MOV AH, 40H
MOV CX, 36
MOV DX, OFFSET ERRMSG
MOV BX, STDERR
INT 21H
MOV AX, 4C01H
INT 21H
FINISH: POP DX
POP BX
MOV CX, 11
MOV DI, OFFSET STREND
STD
TOOCT: MOV AL, BL
AND AL, 07H
OR AL, 30H
STOSB
MOV AH, DL
PUSH CX
MOV CL, 3
SHR BX, CL
SHR DX, CL
MOV CL, 5
SHL AH, CL
OR BH, AH
POP CX
LOOP TOOCT
INC DI
MOV AH, 40H
MOV CX, 13
MOV DX, DI
MOV BX, STDOUT
INT 21H
MOV AX, 4C00H
INT 21H
POPTAB: DB 0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4
DB 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5
DB 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5
DB 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6
DB 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5
DB 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6
DB 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6
DB 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7
DB 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5
DB 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6
DB 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6
DB 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7
DB 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6
DB 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7
DB 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7
STRBUF: DB 10 DUP (?)
STREND: DB ?, 0DH, 0AH
ERRMSG: DB 'Error: stdin: Something went wrong', 0DH, 0AH
BUFCUR: DW 0
BUFLEN: DW 0
BUFPTR: ; No need to explicitly allocate memory space
;DB BUFLEN DUP (?)
CODE ENDS
END START