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

254 0155  EB E7                      jmp        cont9           ;и повторяем до конца

255

256                                    ;Теперь надо точнее проверить первую строку

257

258 0157                         cont7:

259 0157  BB 0966r                   mov        bx, offset PosArray     ;проверим первую строку

260 015A  83 07 02                   add        word ptr [bx], 2 ;первая мерялась без ПС и с

;нуля

261 015D  39 07                      cmp        [bx], ax

262 015F  7E 02                      jle        l4              ;сверяемся с длиннейшей

263 0161  8B 07                      mov        ax, [bx]        ;и при необходимости заменяем

264

265 0163  2D 0002                l4: sub        ax, 2     ;получаем истинную длину максимальной

266 0166  A3 1136r                   mov        MaxLength, ax   ;и сохраняем ее

267

268 0169  53                         push       bx              ;

269

270 016A  8B 1E 0085r                mov        bx, FileNumIn ;логический номер файла-источника

271 016E  33 C9                      xor        cx, cx          ;

272 0170  33 D2                      xor        dx, dx          ;

273 0172  B8 4200                    mov        ax, 4200h       ;

274 0175  CD 21                      int        21h          ;переносим метку на начало файла

275 0177  C7 06 1138r 0000           mov        CurrentPos, 0

276

277 017D                         cont11:

278 017D  5B                         pop        bx              ;

279 017E  8B 0F                      mov        cx, [bx]        ;получаем длину текущей строки

280 0180  53                         push       bx              ;

281 0181  83 E9 02                   sub        cx, 2           ;корректируем

282 0184  8B 1E 0085r                mov        bx, FileNumIn

283 0188  BA 0166r                   mov        dx, offset Buffer

284 018B  B8 3F00                    mov        ax, 3F00h       ;зачитываем строку в буфер

285 018E  CD 21                      int    21h             ;в AX - число считанных байт

286

287 0190  03 D0                      add        dx, ax          ;переходим в конец строки

288 0192  8B 0E 1136r                mov        cx, MaxLength

289 0196  2B C8                      sub        cx, ax       ;в СХ - разница между максимальной

290 0198  74 0C                      jz         l6              ;и текущей строкой

291

292 019A  8B DA                      mov        bx, dx          ;будем танцевать от BX

293 019C  C6 07 20               l1: mov        byte ptr [bx], 20h      ;дополним считанную

            ;строку пробелами

294 019F  43                         inc        bx              ;следующая позиция

295 01A0  49                         dec        cx              ;сколько еще осталось

296 01A1  83 F9 00                   cmp        cx, 0

297 01A4  75 F6                      jne        l1              ;продолжаем до конца

298

299 01A6  C6 07 0D               l6: mov        byte ptr [bx], 0Dh    ;в конец допишем возврат

     ;каретки

300 01A9  43                         inc        bx

301 01AA  C6 07 0A                   mov        byte ptr [bx], 0Ah      ;и перевод строки

302

303 01AD  5B                         pop        bx              ;массив длин

304 01AE  8B 17                      mov        dx, [bx]        ;получаем длину текущей строки

305 01B0  01 16 1138r                add        CurrentPos, dx  ;вычисляем следующую

 ;позицию в файле

306 01B4  53                         push       bx              ;сохраняем

307 01B5  8B 16 1138r                mov        dx, CurrentPos  ;куда ствить указатель

308 01B9  8B 1E 0085r                mov        bx, FileNumIn ;логический номер файла-источника

309 01BD  33 C9                      xor        cx, cx

310 01BF  B8 4200                    mov        ax, 4200h

311 01C2  CD 21                      int        21h      ;и сдвигаем метку в файле на эту длину

312

313 01C4  8B 1E 0139r            l5: mov        bx, FileNumOut  ;логический номер

; выходного файла

314 01C8  8B 0E 1136r                mov        cx, MaxLength   ;длина дополненной строки

315 01CC  83 C1 02                   add        cx, 2           ;с учетом ВК и ПС

316 01CF  BA 0166r                   mov        dx, offset Buffer       ;откуда брать строку

317 01D2  B8 4000                    mov        ax, 4000h

318 01D5  CD 21                      int        21h             ;пишем в файл

319

320 01D7  33 C9                      xor        cx, cx          ;с тем же файлом

321 01D9  33 D2                      xor        dx, dx

322 01DB  B8 4202                    mov        ax, 4202h       ;в конец его

323 01DE  CD 21                      int        21h             ;сдвигаем указатель

324

325 01E0  5B                         pop        bx              ;массив длин

326 01E1  83 C3 02                   add        bx, 2           ;следующий элемент

327 01E4  83 3F 00                   cmp        word ptr [bx], 0 ;не последний ли?

328 01E7  74 03                      je         cont10          ;если последний - заканчиваем

329 01E9  53                         push       bx

330 01EA  EB 91                      jmp        cont11          ;иначе продолжим

331

332 01EC                         cont10:

333 01EC  8B 1E 0139r                mov        bx, FileNumOut

334 01F0  B4 3E                      mov        ah, 3Eh

335 01F2  CD 21                      int        21h             ;закрываем выходной файл

336

337 01F4                         end2:

338 01F4  8B 1E 0085r                mov        bx, FileNumIn

339 01F8  B4 3E                      mov        ah, 3Eh

340 01FA  CD 21                      int        21h             ;закрываем файл-источник

341