-
Notifications
You must be signed in to change notification settings - Fork 1
/
7lab.asm
241 lines (173 loc) · 4.15 KB
/
7lab.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
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
.model small
.286
.data
cmd_size db ?
maxCMDSize equ 127
cmd_text db maxCMDSize + 2 dup(0)
folderPath db maxCMDSize + 2 dup(0)
DTAsize equ 2Ch
DTAblock db DTAsize dup(0)
startText db "SUPERPARENT Program is started", '$'
endText db "SUPERPARENT Program is ended", '$'
reallocErrorMessage db "Bad relocation memory. Error code: ", '$'
runEXEErrorText db "Error running other program. Error code: ", '$'
badFolderErrorText db "Open directory error", '$'
;EXEC Parameter Block
EPBstruct dw 0 ;0 - èñïîëüçóåòñÿ òåêóùåå îêðóæåíèå
dw offset line,0
dw 005Ch, 0, 006Ch, 0 ;Àäðåñà FCB (File control block) ïðîãðàììû
line db 125
db " /?"
line_text db 122 dup(?)
EPBlen dw $ - EPBstruct
extensionEXEFile db "*.exe", 0
DataLength=$-cmd_size
.stack 100h
.code
newline MACRO
push ax
push dx
mov dl, 10
mov ah, 02h
int 21h
mov dl, 13
mov ah, 02h
int 21h
pop dx
pop ax
ENDM
println MACRO info
push ax
push dx
mov ah, 09h
mov dx, offset info
int 21h
newline
pop dx
pop ax
ENDM
printErrorCode MACRO ;Âûâîä ñèìâîëà îøèáêè
add al, '0'
mov dl, al
mov ah, 06h
int 21h
newline
ENDM
main:
;Ïåðåâûäåëåíèå ïàìÿòè
mov ah, 4Ah ;4Ah - èçìåíèòü ðàçìåð áëîêà ïàìÿòè
mov bx, ((CodeLength / 16) + 1) + ((DataLength / 16) + 1) + 32 ;Òðåáóåìûé ðàçìåð â ïàðàãðàôàõ
int 21h
jnc startOfMainProgram ;Ïåðåõîä, åñëè ïåðåíîñ íå óñòàíîâëåí
;åñëè CF=1 => îøèáêà(â AX - êîä îøèáêè)
println reallocErrorMessage
printErrorCode
mov ax, 1
jmp endMain
startOfMainProgram:
mov ax, @data
mov es, ax
xor ch, ch
mov cl, ds:[80h]
mov cmd_size, cl ;Ñîõðàíÿåì ðàçìåð ñòðîêè
mov bh, cl
dec bh
mov si, 82h ;Ïåðåïèñûâàåì â cmd_text ïåðåäàííûé ïóòü
mov di, offset cmd_text
rep movsb
mov ds, ax ;DS óêàçûâàåò íà äàííûå
println startText
mov cmd_size, bh
call parseCMD
mov ah, 3Bh ;Ñìåíèòü êàòàëîã
mov dx, offset folderPath
int 21h
jc openDirectoryError ;CF = 1 => îøèáêà
call findFirstFile
cmp ax, 0
jne endMain ;Åñëè áûëè îøèáêè âûõîäèì èç ïðîãðàììû
call runEXE
cmp ax, 0
jne endMain ;Åñëè áûëè îøèáêè âûõîäèì èç ïðîãðàììû
runFile:
call findNextFile
cmp ax, 0
jne endMain ;Åñëè áûëè îøèáêè âûõîäèì èç ïðîãðàììû
call runEXE
cmp ax, 0
jne endMain ;Åñëè áûëè îøèáêè âûõîäèì èç ïðîãðàììû
jmp runFile
openDirectoryError:
println badFolderErrorText
endMain:
println endText
mov ah, 4Ch ;Çàâåðøåíèå ïðîãðàììû
int 21h
parseCMD PROC
push bx
push cx
push dx
mov si, offset cmd_text
mov di, offset folderPath
mov cl, cmd_size
xor ch,ch
rep movsb
pop dx
pop cx
pop bx
ret
ENDP
runEXE PROC
push bx
push dx
mov ax, 4B00h ;Çàãðóçèòü è âûïîëíèòü ïðîãðàììó
mov bx, offset EPBstruct ;Àäðåñ áëîêà ïàðàìåòðîâ EPB
mov dx, offset DTAblock + 1Eh ;Ïîëó÷àåì èìÿ ôàéëà èç DTA
int 21h
jnc runEXEAllGood
println runEXEErrorText
printErrorCode
mov ax, 1
jmp runEXEEnd
runEXEAllGood:
mov ax, 0
runEXEEnd:
pop dx
pop bx
ret
ENDP
installDTA PROC
mov ah,1Ah ;1Ah - óñòàíîâèòü îáëàñòü DTA
mov dx, offset DTAblock
int 21h
ret
ENDP
findFirstFile PROC
call installDTA
mov ah,4Eh ;Íàéòè ïåðâûé ôàéë
xor cx,cx ;Àòðèáóò ôàéëà äëÿ ñðàâíåíèÿ
mov dx, offset extensionEXEFile ;Àäðåñ ñòðîêè ñ èìåíåì ôàéëà äëÿ ïîèñêà (ìàñêà .exe)
int 21h
jnc findFirstFileAllGood
mov ax, 1
jmp findFirstFileEnd
findFirstFileAllGood:
mov ax, 0
findFirstFileEnd:
ret
ENDP
findNextFile PROC
call installDTA
mov ah,4Fh ;Íàéòè ñëåäóþùèé ôàéë
mov dx, offset DTAblock ;DTA äîëæíà ñîäåðæàòü äàííûå îò ïðåäûäóùåãî âûçîâà 4Eh èëè 4Fh
int 21h
jnc findNextFileAllGood
mov ax, 1
jmp findNextFileEnd
findNextFileAllGood:
mov ax, 0
findNextFileEnd:
ret
ENDP
CodeLength = $ - main
end main