Как уже было отмечено, для функции 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 ;с клавиатуры
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.