Выравнивание длины строки в файле с расширением строки (ассемблер 8086, 1999 г.), страница 4

167 00D9  B8 3C01                    mov        ax, 3C01h       ;

168 00DC  83 C2 02                   add        dx, 2           ;

169 00DF  F8                         clc

170 00E0  CD 21                      int        21h       ;пытаемся создать файл с этим именем

171 00E2  73 0A                      jnc        cont2           ;все путем - продолжаем

172

173 00E4  BA 013Br                   mov        dx, offset DenyOut

174 00E7  B4 09                      mov        ah, 09h

175 00E9  CD 21                      int        21h             ;иначе предупреждаем

176 00EB  E9 0106                    jmp        end2            ;и выходим

177

178 00EE                         cont2:

179 00EE  A3 0139r                   mov        FileNumOut, ax  ;логический номер созданного

180                                                                ; файла

181                      ;--- Получение позиций символов-разделитетей (возвр. каретки) --------

182

183 00F1  33 C9                      xor        cx, cx          ;CX - счетчик положения в файле

184 00F3  BB 0966r                   mov        bx, offset PosArray     ;массив с позициями

185                                                             ; символов возврата каретки

186 00F6                         cont3:

187 00F6  53                         push       bx              ;

188 00F7  51                         push       cx              ;

189

190 00F8  B9 0400                    mov        cx, 400h        ;

191 00FB  BA 0166r                   mov        dx, offset Buffer       ;

192 00FE  8B 1E 0085r                mov        bx, FileNumIn   ;

193 0102  B4 3F                      mov        ah, 3Fh         ;

194 0104  CD 21                      int        21h         ;читаем из файла в буфер 1024 байта

195 0106  3D 0000                    cmp        ax, 0           ;вышли за пределы файла?

196 0109  74 28                      je         cont6           ;да - переход

197

198 010B  59                         pop        cx              ;восстанавливаем счетчики

199 010C  5B                         pop        bx

200 010D  BE 0166r                   mov        si, offset Buffer   ;получаем начало буфера

201

202 0110                         cont5:

203

204 0110  80 3C 0D                   cmp        byte ptr [si], 0Dh  ;сравниваем текущий символ

205                                                        ;в буфере с смволом возврата каретки

206 0113  75 05                      jne        cont4

207 0115  89 0F                      mov        [bx], cx        ;если совпал - пишем в массив,

208 0117  83 C3 02                   add        bx, 2           ;какую позицию в файле занимает

209                                                              ;этот символ

210                                                         ;сквозная нумерация позиций - через

211                                                              ;регистр CX

212

213 011A                         cont4:

214 011A  41                         inc        cx         ;переход к следующей позиции в файле

215 011B  46                         inc        si              ;и в буфере

216 011C  48                         dec        ax              ;буфер закончился?

217 011D  75 F1                      jnz        cont5           ;нет - продолжаем сравнение

218

219 011F  53                         push       bx              ;сохраняем счетчики

220 0120  51                         push       cx              ;

221 0121  8B 1E 0085r                mov        bx, FileNumIn   ;

222 0125  33 C9                      xor        cx, cx          ;

223 0127  BA 0400                    mov        dx, 400h        ;

224 012A  B8 4201                    mov        ax, 4201h     ;сдвигаем позицию в файле на 1024

225 012D  CD 21                      int    21h                 ;символа

226 012F  59                         pop        cx

227 0130  5B                         pop        bx              ;восстанавливаем счетчики

228 0131  EB C3                      jmp        cont3           ;продолжаем считывание

229

230                      ;---- Преобразование позиций в длины строк -------------------------

231

232 0133                         cont6:

233 0133  59                         pop        cx              ;по окончании файла записываем

234 0134  5B                         pop        bx              ;в массив позицию последнего

235 0135  89 0F                      mov        [bx], cx        ;символа

236

237 0137  BB 0966r                   mov        bx, offset PosArray     ;на начало массива

238 013A  8B 07                      mov        ax, [bx]        ;позиция первого символа ВК

239 013C  8B D0                      mov        dx, ax          ;

240

241 013E                         cont9:

242 013E  8B 4F 02                   mov        cx, [bx+2]      ;позиция следющего символа

243 0141  83 F9 00                   cmp        cx, 0          ;не был ли предыдущий последним?

244 0144  74 11                      je         cont7           ;да - выходим

245 0146  2B CA                      sub        cx, dx         ;полная длина строки с символами

246                                                              ;ВК и перевода строки

247 0148  3B C8                      cmp        cx, ax          ;строка длиннее предыдущей?

248 014A  7E 02                      jle        cont8

249 014C  8B C1                      mov        ax, cx          ;если да - она новый эталон

250 014E                         cont8:

251 014E  83 C3 02                   add        bx, 2           ;

252 0151  8B 17                      mov        dx, [bx]  ;запоминаем позицию для использования

253 0153  89 0F                      mov        [bx], cx  ;а в массиве заменяем позицию длиной