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

83

84 0041                         prob2:

85 0041  46                          inc        si              ;считываем очередной символ

    ; параметров

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

87 0048  E1 F7                       loope      prob2           ;повторяем, пока не найдем

    ;не-пробел

88

89 004A  83 F9 00                    cmp        cx, 0           ;конец строки?

90 004D  74 42                       je         is1stparam      ;проверка первого и ввод второго

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

92 004F  33 DB                       xor        bx, bx

93 0051                         name2:

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

95 0056  88 87 00D5r                 mov        NameOut[bx+2], al   ;заносим очередной символ

96 005A  43                          inc        bx              ;след. символ в имени

97 005B  46                          inc        si              ;след. символ в параметрах

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

99 0062  E0 ED                       loopne     name2          ;повторяем, пока не найдем пробел

100 0064  C6 87 00D5r 00             mov        byte ptr NameOut[bx+2], 0    ;в конец имени –

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

101 0069  C6 06 00D2r FF             mov        IsSecondParam, -1 ;второй параметр в командной 102                                                              ;строке присутствует!

103 006E  EB 21 90                   jmp        is1stparam      ;проверка параметров

104

105                      ;-----Получение имени файла-источника с клавиатуры --------------------

106 0071                         noparam:

107 0071  BA 0000r                   mov        dx, offset InvitIn

108 0074  B4 09                      mov        ah, 09h         ;Вывод приглашения на экран

109 0076  CD 21                      int        21h

110 0078  BA 001Fr                   mov        dx, offset NameIn       ;Адрес ответа

111 007B  52                         push       dx

112 007C  B8 0C0A                    mov        ax, 0C0Ah       ;Получение строки

113 007F  CD 21                      int        21h

114

115 0081  5A                         pop        dx              ;Берем адрес ответа

116 0082  8B DA                      mov        bx, dx

117 0084  33 C0                      xor        ax, ax          ;ax=0

118 0086  8A 47 01                   mov        al, [bx+1]      ;al = истинная длина ответа

119 0089  03 D8                      add        bx, ax

120 008B  83 C3 02                   add        bx, 2           ;в конец ответа

121 008E  C6 07 00                   mov        byte ptr [bx], 0h       ;заменяем "ввод" на 0

122

123 0091                         is1stparam:

124 0091  BA 001Fr                   mov        dx, offset NameIn  ;на случай, если мы попали 125                                               ;сюда из раздела анализакомндной строки

126 0094  B8 3D00                    mov        ax, 3D00h       ;ф-ия 3Dh прерывания 21h

127 0097  83 C2 02                   add        dx, 2

128 009A  F8                         clc

129 009B  CD 21                      int        21h             ;попытка открыть

130 009D  73 0A                      jnc        cont1           ;все в порядке - продолжаем

131

132 009F  BA 0087r                   mov        dx, offset DenyIn

133 00A2  B4 09                      mov        ah, 09h

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

135 00A6  E9 0153                    jmp        end1            ;и выходим

136

137 00A9                         cont1:

138 00A9  A3 0085r                   mov        FileNumIn, ax ;сохраняем логический номер файла

139

140 00AC  BA 00D3r                   mov        dx, offset NameOut ;на случай, если сюда попали

141                                                          ;из раздела анализа комндной строки

142 00AF  80 3E 00D2r FF             cmp        IsSecondParam, -1  ;был ли второй параметр в

143                                                              ; командной строке?

144 00B4  74 20                      je         is2ndparam      ;тогда ввод с клавиатуры не

145                                                                ; нужен

146                      ;----------Получение имени файла-приемника с клавиатуры ---------------

147

148 00B6  BA 00B2r                   mov        dx, offset InvitOut

149 00B9  B4 09                      mov        ah, 09h

150 00BB  CD 21                      int        21h             ;снова приглашение

151

152 00BD  BA 00D3r                   mov        dx, offset NameOut

153 00C0  52                         push       dx              ;запоминаем адрес ответа

154 00C1  B8 0C0A                    mov        ax, 0C0Ah

155 00C4  CD 21                      int        21h             ;получаем ответ

156

157 00C6  5A                         pop        dx              ;берем адрес

158 00C7  8B DA                      mov        bx, dx          ;

159 00C9  33 C0                      xor        ax, ax          ;

160 00CB  8A 47 01                   mov        al, [bx+1]      ;истинная длина

161 00CE  03 D8                      add        bx, ax          ;

162 00D0  83 C3 02                   add        bx, 2           ;

163 00D3  C6 07 00                   mov        byte ptr [bx], 0h       ;превращаем в нуль-

164                                       ; терминированную строку для дальнейшего использования

165 00D6                         is2ndparam:

166 00D6  B9 0001                    mov        cx, 1           ;