Поиск:

Ответ в темуСоздание новой темы Создание опроса
> DoS окружение и параметры через командную строку! 
:(
    Опции темы
Baton2007
Дата 9.4.2010, 16:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 117
Регистрация: 29.11.2007

Репутация: нет
Всего: нет



По заданию надо написать родительский и дочерний процессы . Родительский получает имя дочернего из командной строки :
C:\MASM_1\PA.EXE ''C:\MASM_1\CP.exe''
Дочерний процесс должен прочитать из окружения имя файла который ему надо открыть.
Пишу в командной строке так C:\MASM_1\СP.exe SET WORKFILE=FILE39.txt
Правильно ли я параметры передаю а то пишет что переменной нет , хотя если просмотреть все окружение то переменная добавлена.

Родитель
Код

d_seg segment 'data'
child_name db 20 dup (0)
blok_param db 7 dup (0)
str_1 db 'The child is active',10,13,'$'
str_3 db 'Error child process',10,13,'$'
err_c db 0
d_seg ends

c_seg segment 'code'
assume cs:c_seg ,ds:d_seg
; ===============ПОДПРОГРАММА============
Get_cmd proc
       mov si,80h   ;SI=смещение командной строки.
       lodsb        ;Получим кол-во символов.
       cmp al,25    ;Больше 25?
       ja No_string ;Да - на метку No_string 
       or al,al     ;Нет командной строки?
       jz No_string ;На метку No_string 

       inc si       ;Теперь SI указывает на первый символ строки.

Next_char:
       lodsb      ;Получаем очередной символ.
       cmp al,0Dh ;Конец строки?
       je Got_cmd ;Да - на выход... 
       stosb      ;Иначе - сохраним символ в переменной File_name (stosd - запись в память по адресу al)
       jmp short Next_char ;Следующий символ... 

Got_cmd:
       xor al,al ;Строка получена! Допишем ASCII 0 в конец
       stosb
       clc  ;сбросить флаг переноса CF
       ret  ;Выходим из процедуры

No_string:
       stc  ;Строка неверна! Установим флаг переноса СF.
       ret  ;Выходим из процедуры
Get_cmd endp
START:
mov ax,d_seg
mov ds,ax

      mov bx,offset Finish
      mov cl,4
      shr bx,cl
      inc bx
      mov ah,4Ah
      int 21h    ;Ужимаем размер отведенной памяти до метки Finish
      
;====================================ПОЛУЧЕНИЕ ИМЕНИ ФАЙЛА ИЗ КОМАНДНОЙ СТРОКИ======================
mov di, offset child_name 
 call Get_cmd ;Получим командную строку.  
;===================================================ЗАПУСК ДОЧЕРНЕГО ПРОЦЕССА========================
      mov ah,4Bh  ;Функция EXEC (EXECute - запус программы)
      mov dx,offset child_name ;Имя файла для запуска
      mov al,0    ;Загрузка и запуск
      int 21h
      
      jc error
      mov ah,9h
      mov dx,offset str_1
      int 21h
      mov ah,4ch
      int 21h
      
    error:
    mov ah,9h
    mov dx,offset str_3
    mov ah,4ch
    int 21h
Finish:
c_seg ends 
end START 


Дочерний
Код

d_seg segment 'data'
fname db 50 dup(0)
envvar db 'WORKFILE='
err_code db 0
str1 db 'CHILD is ACTIV',10,13,'$'
str2 db 'File open',10,13,'$'
str3 db 'Error of opening of a file ',10,13,'$'
str4 db 'Error variable environment', 10,13,'$'
len equ $-envvar ; подстановка
handle dw 0
buf db ?
d_seg ends 

c_seg segment 'code'
assume ds:d_seg,cs:c_seg 
START:
mov ax,d_seg
mov ds,ax

mov ah,9h
lea dx,str1
int 21h
;====================ПОЛУЧЕНИЕ ПАРАМЕТРОВ ИЗ ОКРУЖЕНИЯ====================
mov ax,es:2ch ; сегмент окружения
mov es,ax
;Ищем в окружение подстроку параметров
mov BX,0
cld
next_per:
        mov CX,len
        mov SI, offset envvar
        mov DI,BX
   repe cmpsb 
        je extraction
;Переменная не совпадает ищем дальще
;Ищем конес строки 0
test_nul:
        cmp byte ptr ES:[BX],0 ; сравнение с 0
        je next_nul ; ноль найден
        inc BX
        jmp test_nul 
; Проверка на 0 конец всего окружения
next_nul:
        inc BX
        cmp byte ptr ES:[BX],0 ; сравнение с 0
        jne next_per
; Переменная не найдена 
mov err_code,1
mov ah,9h
mov dx,offset str4
int 21h
jmp fin

extraction:
           mov BX,-1
    no_end:
           inc BX
           cmp byte ptr ES:[DI][BX],0 ; сравнение с 0
           jne no_end
; BX-длина переменной
; DI- первый байт значения переменной
; ES- сегмент окружения
; DS- сегмент данных
;==========================ПЕРЕНОС ЗНАЧЕНИЯ ПЕРЕМЕННОЙ В ПРОГРАММУ=========
mov CX,BX
push ES
push DS
pop ES
pop DS
mov SI,DI
mov DI, offset ES:fname
rep movsb 
push ES
pop DS
;=================ИМЯ ФАЙЛА===============
mov ah,9h
mov dx, offset fname
int 21
;=====================================ОТКРЫВАЕМ ФАИЛ=============================
mov    ax, d_seg
mov    es, ax
mov ah,3dh
mov al,0 ; открываем для чтения
mov dx,offset fname
int 21h
;=====================================ПРОВЕРКА ОТКРЫТИЯ===========================
mov handle,ax
jnc open        ; заменил cmp ax, 0

mov err_code,1
mov ah,9h
mov dx,offset str3
int 21h
jmp fin

open:
mov ah,9h
mov dx,offset str2
int 21h

out_text:
    mov ah,3fh
    mov bx, handle        ; добавил, как же он будет читать файл без дескриптора
    mov dx,offset buf
    mov cx,1
    int 21h
    cmp ax,0
    je close
    mov ah, 02h
    mov dl, buf
    int 21h
    jmp out_text

close:            ; закрываем файл, после чтения
    mov ah,3eh
    int 21h
fin:
    mov ah, 10h
    int 16h
    mov    ah, 4ch
    mov    al, err_code
    int    21h
c_seg ends 
end START 

PM MAIL   Вверх
bugmenot1
Дата 18.4.2010, 12:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 59
Регистрация: 8.5.2008

Репутация: нет
Всего: 0



Baton2007 задание параметров окружения и запуск программы я бы разделил.
SET WORKFILE=FILE39.txt
C:\MASM_1\СP.exe 

А если бы условия задания было немного другим, задавал бы прямо параметром коммандной строки
C:\MASM_1\СP.exe FILE39.txt

Про чтения параметров рекомендую тему ASM -> Asm: Общие вопросы -> GetCommandLine, непонятки
А насчёт чтения параметров окружения, рекомендую обратить внимание на GetEnvironmentVariable (см. kernel32.inc)
PM MAIL   Вверх
iff
Дата 18.4.2010, 12:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Администратор
**


Профиль
Группа: Участник
Сообщений: 949
Регистрация: 23.3.2007

Репутация: 4
Всего: 16



Вы неправвильно добавляете переменную в окружение, bugmenot1 - прав.

bugmenot1, в ДОС нет никаких kernel32.


--------------------
DOS... Синей пеленой экран заполнил чистый DOS 
Мышь... Стала вдруг квадратной, потеряла форму мышь... 
Я разбил окно, девяностопятое мастдайное окно, 
И поставил DOS, и тогда увидел: Это счастье, — вот оно.  
PM MAIL WWW   Вверх
bugmenot1
Дата 18.4.2010, 14:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 59
Регистрация: 8.5.2008

Репутация: нет
Всего: 0



iff пользуясь случаем, публично благодарю за решение в теме ASM -> Asm: Общие вопросы - > Работа со структурами данных и функциями, Вывести на экран.

Сейчас загрузил FreeDos на VirtualBox, действительно SET есть там (а значит есть и в MS-DOS).
Я почему-то решил что это только в Win32, по этому посоветовал копать в направлении Kernel32.inc

С поправкой согласен.  smile 

Это сообщение отредактировал(а) bugmenot1 - 18.4.2010, 14:40
PM MAIL   Вверх
iff
Дата 18.4.2010, 16:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Администратор
**


Профиль
Группа: Участник
Сообщений: 949
Регистрация: 23.3.2007

Репутация: 4
Всего: 16



Подожди, но в виндовс есть эмулятор MS-DOS (командная строка COMMAND.COM, а в XP есть ещё CMD.EXE, правда CMD.EXE - это консольное приложение виндовс.)
Нажимай в Windows XP  пуск->все программы->стандартные->командная строка (а в ивндовс более младших пуск->сеанс MS-DOS) и будет тебе MS-DOS. smile


Цитата

iff пользуясь случаем, публично благодарю за решение в теме ASM -> Asm: Общие вопросы - > Работа со структурами данных и функциями, Вывести на экран.

Сейчас загрузил FreeDos на VirtualBox, действительно SET есть там (а значит есть и в MS-DOS).

У меня кстате не работает тот код во фридосе. Потому что там некоторая заминка с переводом строки, строка не переводится ниже, ОС печатает приглашение (приглашение - это в ДОСе C:\>_) на той же строчке, где печатала программа. надо чтобы строка для вывода заканчивалась символами 0D0A, тогда всё нормально. Я изменил 6-ую строчку и всё стало нормально.

Это сообщение отредактировал(а) iff - 18.4.2010, 20:14


--------------------
DOS... Синей пеленой экран заполнил чистый DOS 
Мышь... Стала вдруг квадратной, потеряла форму мышь... 
Я разбил окно, девяностопятое мастдайное окно, 
И поставил DOS, и тогда увидел: Это счастье, — вот оно.  
PM MAIL WWW   Вверх
bugmenot1
Дата 20.4.2010, 13:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 59
Регистрация: 8.5.2008

Репутация: нет
Всего: 0



iff будет, но он то для совместимости оставлен, а в х64 системах (XP+) ещё больше отошли от этого.
По этому на современный лад считаю что стоит искать решение через ВинАпи, или же через современные аналоги, которые впрочем не очень то и документированны.
Например ASM альтернатива тому же GetTickCount()
Код
int t1;
  __asm {
    int 0x2A
    mov t1,eax
  }


Спасибо за инфу, но я использовал TASM и под "MS-DOS" в Windows XP.

Это сообщение отредактировал(а) bugmenot1 - 20.4.2010, 13:20
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Asm для начинающих"
MAKCim
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой КОД.
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, MAKCim.

 
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Asm для начинающих | Следующая тема »


 




[ Время генерации скрипта: 0.0444 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.