Консультация № 86774
14.05.2007, 00:23
0.00 руб.
0 3 3
Здравствуйте. У меня такая проблема: нужно считать текстовый файл с диска. Подскажите пожалуйста, как передать имя входного файла из командной строки. Если можно по подробней и с примерчиком (я знаком с ассемблером совсем не давно)

Обсуждение

Неизвестный
14.05.2007, 05:13
общий
это ответ
Здравствуйте, Пушкин,Александр,Сергеевич!
Ввод строки уже обсуждался. Вам нужно использовать функцию 0ah 21 преравания
подробнее-смотрите ответы на вопросы 83956 и 84235
давно
Посетитель
7438
7205
14.05.2007, 11:49
общий
это ответ
Здравствуйте, Пушкин,Александр,Сергеевич!
Предыдущий эсперт ответил неправильно.
Параметр командной строки при старте программы хранится по адресу DS:80h
в виде <длина>,<строка>,0dh, где
<длина> - байт, в котором длина строки параметра
<строка> - сам параметр, сюда попадает все, что за именем программы, начиная с разделительных пробелов (или табуляции).
Строка параметра заканчивается не нулем, а кодом 0dh.
Рекомендую загрузить программу с заданным параметром под отладчиком
и посмотреть с адреса 80h и тогда станет все понятно
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
Неизвестный
14.05.2007, 15:12
общий
это ответ
Здравствуйте, Пушкин,Александр,Сергеевич!
Программа в приложении с подробными коментариями
Удачи

Приложение:
title 86774stacksg segment stack dw 32 dup(?)stacksg endsdata segment filenem label byte ;Ввод имени файла с клавиатуры filemax db 21 ; путь и имя до 20 символов filelen db ? fileptr db 21 dup(‘ ‘) endcod db 00 ;Код ошибки fnom dw ? ;Файловый номер pbuff db 512 dup(‘ ‘);Буфер передачи данных openf db 0dh,0ah,‘*** Open error ***$‘ readf db 0dh,0ah,‘*** Read error ***$‘ row db 00 ;Номер строкиdata endscode segment assume cs:code,ds:databegin: mov ax,data mov ds,ax call p10file ;Ввод имени файла call o10open ;Открытие файла cmp endcod,01 ;Если ошибка то выход je exitb10loop: call r10read ;Процедура чтения файла cmp endcod,01 ;Если ошибка то выход je exit call f10prt ;Вывод на экран jmp b10loopexit: mov ah,4ch int 21h;--- Процедура вывод на экранf10prt proc mov ah,40h mov bx,01 mov cx,512 lea dx,pbuff int 21h retf10prt endp;--- Процедура чтения файлаr10read proc mov ah,3fh mov bx,fnom ;в BX файловый номер mov cx,512 ;Длина буфера записи lea dx,pbuff ;Адрес буфера int 21h jc r20error ;Если ошибка чтения cmp ax,00 ;Конец файла? je r30 retr20error: ; да - ошибка lea dx,readf ; сообщение об ошибке и выход call e10error ;Процедура вывода ошибокr30: mov endcod,01 ;Код завершения retr10read endp;--- Процедура вывода ошибокe10error proc mov ah,09h int 21h rete10error endp;--- Процедура открытия файлаo10open proc mov ah,3dh mov al,00 ;Только чтение mov cl,00 ;Обычный файл(не системный не спрятанный ...) lea dx,fileptr ;Путь и имя открываемого файла int 21h jc o20 ;Если ошибка открытия mov fnom,ax ; нет ошибки сохраняем файловый номер reto20: mov endcod,01 ; да - ошибка lea dx,openf ; сообщение об ошибке и выход call e10error ;Процедура вывода ошибок reto10open endp;--- Процедура ввода имени файла с клавиатурыp10file proc mov ah,0ah lea dx,filenem int 21h ;Получаем ASCIIZ строку sub bx,bx mov bl,filelen ;Заменяем симол ввода 0dh mov fileptr[bx],‘0‘ ; на символ ‘0‘ retp10file endpcode ends end begin
Форма ответа