-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathsmallest_diff_w_N.asm
172 lines (143 loc) · 3.46 KB
/
smallest_diff_w_N.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
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
.MODEL SMALL
.STACK 100H
.DATA
CR EQU 0DH
LF EQU 0AH
I DW 0
FLAG DB 0
N DW ?
LEN DW 1
POS DW ?
J DW ?
DIFF DW ?
ARR DW 100 DUP(?) ; The array that we will sort
NEWLINE DB CR, LF, '$'
INPUT_MSG DB 'Number of elements in the array: $'
ARRAY_INPUT_MSG DB 'Array elements:', CR, LF, '$'
SORTED_ARRAY_MSG DB 'Sorted array: $'
.CODE
MAIN PROC
; Initialize Data Segment
MOV AX, @DATA
MOV DS, AX
; Input number of elements
CALL INPUT_INTEGER
MOV N, DX
; Print new line
CALL PRINT_NEWLINE
; Input N integers
MOV CX, N
MOV SI, 0 ; Point SI to the address of ARR
TOP:
CALL INPUT_INTEGER
MOV WORD ARR[SI], DX ; Store the input in the array
ADD SI, 2 ; Increment SI by 2 to point to the next element
CALL PRINT_NEWLINE
LOOP TOP
; Calculate minimum difference
CALL MIN_DIFF
; Output the element with the smallest difference
MOV BX, POS
SHL BX, 1
MOV BX, ARR[BX]
CALL PRINT_INTEGER
; Exit program
MOV AH, 4CH
INT 21H
MAIN ENDP
PRINT_NEWLINE PROC
LEA DX, NEWLINE ; Print New line
MOV AH, 9
INT 21H
RET
PRINT_NEWLINE ENDP
MIN_DIFF PROC
MOV I, 0
MOV DIFF, 7FFFH ; Initialize DIFF to the largest possible value
MOV POS, 0
LOOP_FOR:
CMP I, N ; If I >= N, end loop
JGE END_LOOP_FOR
MOV BX, I
SHL BX, 1
MOV AX, ARR[BX] ; Load array element
MOV CX, N
CMP AX, CX
JG GREATER
SUB AX, CX ; Calculate difference if AX < CX
JMP COMPARE_DIFF
GREATER:
SUB CX, AX ; Calculate difference if AX >= CX
MOV AX, CX
COMPARE_DIFF:
CMP AX, DIFF ; Compare with current smallest difference
JGE NEXT
MOV DIFF, AX ; Update smallest difference
MOV POS, I
NEXT:
INC I
JMP LOOP_FOR
END_LOOP_FOR:
RET
MIN_DIFF ENDP
INPUT_INTEGER PROC
XOR DX, DX ; Initialize DX to 0
MOV I, 0 ; Initialize digit count
INPUT_LOOP:
MOV AH, 1
INT 21H
CMP AL, CR
JE END_INPUT_LOOP
CMP AL, LF
JE END_INPUT_LOOP
CMP AL, '-'
JNE DIGIT_INPUT
CMP I, 0
JNE END_INPUT_LOOP
MOV FLAG, 1
JMP INPUT_LOOP
DIGIT_INPUT:
SUB AL, '0'
MOV BX, AX
MOV AX, 10
MUL DX
ADD DX, BX
INC I
JMP INPUT_LOOP
END_INPUT_LOOP:
CMP FLAG, 1
JNE END_INPUT
NEG DX ; Make DX negative if FLAG is set
MOV FLAG, 0 ; Reset FLAG
END_INPUT:
RET
INPUT_INTEGER ENDP
PRINT_INTEGER PROC
CMP BX, 0
JGE POSITIVE
MOV AH, 2
MOV DL, '-' ; Print '-' for negative numbers
INT 21H
NEG BX
POSITIVE:
MOV AX, BX
MOV I, 0
PUSH_WHILE:
XOR DX, DX
MOV BX, 10
DIV BX
PUSH DX
INC I
CMP AX, 0
JNE PUSH_WHILE
MOV AH, 2
POP_WHILE:
POP DX
ADD DL, '0'
INT 21H
DEC I
CMP I, 0
JG POP_WHILE
RET
PRINT_INTEGER ENDP
END MAIN