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

            Как уже было отмечено, для функции 9h стандартным символом окончания строки является знак доллара (“$”). Это не позволяет использовать его внутри текста, предназначенного для вывода.

            Для функции 0Ch необходимо в первом символе строки указывать максимально возможную длину этой строки, чтобы она могла ограничить ввод. Более того, во втором символе эта функция возвращает истинную длину введенной строки, без учета символа «Ввод», так что для дальнейшего использования имени файла необходимо брать его со смещением 2, чтобы пропустить максимальную и заданную длины.

            Хотя по окончании ввода нажимается клавиша “Enter”, этот последний символ не отображается на экране. Поэтому следующая выводимая строка начинается не с новой линии, а продолжает предыдущую. Чтобы этого избежать, необходимо перед каждой выводимой строкой ставить символ перевода строки (код 0Ah).


Листинг программы

Turbo Assembler  Version 4.1        21/12/99 11:47:39

kurs.asm

1 0000                         mystack segment stack

2 0000  0400*(??)                  db 1024 dup (?)

3 0400                         ends

4 0000                         data segment

5 0000  82 A2 A5 A4 A8 E2 A5+    InvitIn db 'Введите имя исходного файла : $'

6       20 A8 AC EF 20 A8 E1+

7       E5 AE A4 AD AE A3 AE+

8       20 E4 A0 A9 AB A0 20+

9       3A 20 24

10 001F  64 65*(??)               NameIn db 100, 101 dup (?)   ;длина имени и имя источника

11 0085  0000                     FileNumIn  dw 0              ;логический номер файла-источника

12 0087  0A 8E E8 A8 A1 AA A0+    DenyIn db 0Ah, 'Ошибка : невозможно открыть файл-источник$'

13       20 3A 20 AD A5 A2 AE+

14       A7 AC AE A6 AD AE 20+

15       AE E2 AA E0 EB E2 EC+

16       20 E4 A0 A9 AB 2D A8+

17       E1 E2 AE E7 AD A8 AA+

18       24

19

20 00B2  0A 82 A2 A5 A4 A8 E2+    InvitOut db 0Ah, 'Введите имя файла-приемника : $'

21       A5 20 A8 AC EF 20 E4+

22       A0 A9 AB A0 2D AF E0+

23       A8 A5 AC AD A8 AA A0+

24       20 3A 20 24

25 00D2  00                       IsSecondParam db 0    ;присутствует ли второй параметр

26                                                      ;в командной строке (априори нет)

27 00D3  64 65*(??)               NameOut db 100, 101 dup (?)   ;длина имени и имя приемника

28 0139  0000                     FileNumOut dw 0       ;логический номер файла-источника

29 013B  0A 8E E8 A8 A1 AA A0+    DenyOut db 0Ah, 'Ошибка : невозможно создать файл-приемник$'

30       20 3A 20 AD A5 A2 AE+

31       A7 AC AE A6 AD AE 20+

32       E1 AE A7 A4 A0 E2 EC+

33       20 E4 A0 A9 AB 2D AF+

34       E0 A8 A5 AC AD A8 AA+

35       24

36

37 0166  0400*(0000)              Buffer dw 1024 dup (0);буфер строк для обработки

38 0966  03E8*(0000)              PosArray dw 1000 dup (0)   ;массив позиций символов ВК в файле

39 1136  0000                     MaxLength dw 0        ;максимальная длина строки

40 1138  0000                     CurrentPos dw 0       ;текущая позиция в файле-источнике

41

42 113A                         ends

43

44 0000                         code segment byte public 'Code'

45                                   assume cs:code, ds:data, ss:data

46

47 0000                         begin:

48 0000  B8 0000s                    mov        ax, data     ;Указание на сегмент данных

49 0003  8E D8                       mov        ds, ax

50

51                      ;---------- Получение имен файлов ----------------------

52

53                  ;При запуске программы регистр ES указывает на сегмент префикса

54                  ;программого сегмента, откуда можно получить информацию о параметрах

55                  ;командной строки

56

57 0005  33 C9                       xor        cx, cx

58 0007  33 F6                       xor        si, si

59 0009  26: 8A 8C 0080              mov        cl, byte ptr es:[si+80h]  ;длина строки

;параметров

60 000E  83 F9 00                    cmp        cx, 0           ;есть ли эта строка вообще?

61 0011  74 5E                       je         noparam         ;если нет - вводим с клавиатуры

62 0013  41                          inc        cx

63 0014                         prob1:

64 0014  46                          inc        si        ;считываем очередной символ параметров

65 0015  26: 80 BC 0080 20           cmp        byte ptr es:[si+80h], 20h   ;это пробел?

66 001B  E1 F7                       loope      prob1       ;повторяем, пока не найдем не-пробел

67

68 001D  83 F9 00                    cmp        cx,0            ;строка кончилась?

69 0020  74 4F                       je         noparam         ;если да - вводим с клавиатуры

70 0022  33 DB                       xor        bx, bx

71 0024                         name1:

72 0024  26: 8A 84 0080              mov        al, byte ptr es:[si+80h]

73 0029  88 87 0021r                 mov        NameIn[bx+2], al   ;заносим очередной символ

74 002D  43                          inc        bx              ;след. символ в имени

75 002E  46                          inc        si              ;след. символ в параметрах

76 002F  26: 80 BC 0080 20           cmp        byte ptr es:[si+80h], 20h   ;это пробел?

77 0035  E0 ED                       loopne     name1         ;повторяем, пока не найдем пробел

78 0037  C6 87 0021r 00              mov        byte ptr NameIn[bx+2], 0    ;в конец имени –

79                                                                       ;нулевой символ

80 003C  83 F9 00                    cmp        cx, 0           ;это последний символ строки?

81 003F  74 50                       je         is1stparam      ;проверка первого и ввод второго

82                                                              ;с клавиатуры