Поиск:

Ответ в темуСоздание новой темы Создание опроса
> как получить параметры из командной строки? 
:(
    Опции темы
bip
Дата 9.12.2008, 19:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Ещё вопросик возник. А как получить  параметры(слово и число повторений) из командной строки?
как из DTA их вытащить? smile  (TASM)


Это сообщение отредактировал(а) bip - 9.12.2008, 21:35
PM MAIL ICQ   Вверх
Akina
Дата 9.12.2008, 22:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

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



Цитата(bip @  9.12.2008,  20:30 Найти цитируемый пост)
как получить  параметры(слово и число повторений) из командной строки?

DTA тут не при чём. Строка запуска находится в PSP. Символ по смещению 80h содержит длину, а начиная с 81h, начинается сама строка.
Сегмент PSP следует либо созранить при старте, либо запросить через int 21h fn 51h.


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
bip
Дата 9.12.2008, 22:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Akina,Dta находится как раз по смещению 81h в PSP и содержит символы командной строки(т.е. буфер рабочей области). но  это не важно.
Я торможу на счёт того, как взять эти параметры оттуда  smile 

p.s. помогите пожалуйста, добрые люди...

Это сообщение отредактировал(а) bip - 9.12.2008, 22:53
PM MAIL ICQ   Вверх
Akina
Дата 9.12.2008, 23:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

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



Цитата(bip @  9.12.2008,  23:51 Найти цитируемый пост)
Dta находится как раз по смещению 81h в PSP и содержит символы командной строки(т.е. буфер рабочей области). но  это не важно.

Вы походу не знаете что такое DTA. И адрес DTA отправлен в область параметров только для того, чтобы программа не осталась вообще без DTA. Я уж не говорю о том, что с ДОС 3.0 DTA мало кто использует.

Цитата(bip @  9.12.2008,  23:51 Найти цитируемый пост)
как взять эти параметры оттуда  

Что значит как? искать там ASCII-цифры, конвертировать их в bin, следить, что не вылез за длину.


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
bip
Дата 10.12.2008, 00:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(Akina @  9.12.2008,  23:28 Найти цитируемый пост)
Вы походу не знаете что такое DTA. И адрес DTA отправлен в область параметров только для того, чтобы программа не осталась вообще без DTA. Я уж не говорю о том, что с ДОС 3.0 DTA мало кто использует.


На сколько я знаю под префикс программного сегмента выделяется 100(байт) и он включает в себя буфер рабочей области. smile 
соответственно у него и адрес 81h. smile 


Цитата(Akina @  9.12.2008,  23:28 Найти цитируемый пост)
то значит как? искать там ASCII-цифры, конвертировать их в bin, следить, что не вылез за длину. 


с этим я давно разобрался...

Меня интересует процесс самого изъятия параметра ну допустим в переменную какую-либо. 
Смотрел по форуму, есть пару тем, но собственно нигде нет реализации этого алгоритма... 
PM MAIL ICQ   Вверх
airyashov
Дата 10.12.2008, 08:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Что может быть проше, чем анализ строки по символам.


--------------------
icq:3(один)7748666
mail:airyashov( а )inbox.ru
PM MAIL   Вверх
Akina
Дата 10.12.2008, 09:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

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



Цитата(bip @  10.12.2008,  01:35 Найти цитируемый пост)
На сколько я знаю под префикс программного сегмента выделяется 100(байт) и он включает в себя буфер рабочей области. 

Почти так. Пропущено одно слово - НАЧАЛЬНЫЙ буфер. Любая программа, намеренная работать через FCB и написанная не через задницу, первым делом переопределяет положение DTA.

Цитата(bip @  10.12.2008,  01:35 Найти цитируемый пост)
Меня интересует процесс самого изъятия параметра ну допустим в переменную какую-либо. 

навскидку нечто вроде (идея):
Код

param dw 0

start: 
  mov ax,@data
  mov es,ax
  mov si,81h
  cld
nextchar:
  lodsb
  cmp al,0dh
  je str_end
  call al_is_digit
  jne nextchar
  sub al,'0'
  call mul_ESparam_by_10
  cbw
  add es:param,ax
  jmp nextchar
str_end:

тут нет проверки на не-цифры в середине строки... но это же идея.


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
bip
Дата 10.12.2008, 10:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Вот м ищу я параметр.... каким образом загнать его в 
Код
BUFFER db ? 
допустип ?  smile 
Код

myprgm: 
mov ax,@data
mov ds, ax
;------------------------
mov es, ax
mov si,81h 
int 21h
;------------------------
scan_params:
        lodsb                                 ; прочитать следующий символ из параметра,
        cmp        al,0Dh                  ; если это 0Dh - это был последний параметр
        je         params_ended      ; и он кончился,
        cmp        al,20h                  ; если это 20h - этот параметр кончился,
        jne        scan_params        ; но могут быть еще
params_ended:
        dec        si                           ; SI - первый байт после конца последнего
        mov        byte ptr [si],0       ; параметра - записать в него 0



PM MAIL ICQ   Вверх
bip
Дата 10.12.2008, 20:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Сделал, но выводит посимвольно, а записываю в buffer и потом пытаюсь его вывести не хочет, ПОЧЕМУ?  smile 
Код

model small
.stack 80h
.data  
  BUFFER DB  ?
msg  Db "No parametrs!", 13, 10, "$"

  .CODE
start:

  mov    cl,ds:80h ; количество символов     в командной строке
  cmp    cl,0
  je     no_param  ; нет параметров - просим  указать параметры
  mov    si,81h    ; со смещением 81h начинается область параметров
  cld
get_parm:

; Загружаем в al очередной символ строки параметров
  lods   BYTE PTR es:[si] 
  mov  AL,byte ptr ES:[si]

;  mov    ah,2      ; выводим его на экран {ПОСИМВОЛЬНО ВЫВОДИТ}
 ; mov    dl,al

  mov  buffer+SI,al;посимвольно переносим маску из PSP в переменную buffer 
  int    21h
  loop get_parm
  jmp  end_progr


no_param:
;xor ax,ax
;MOV AH,9                      
;LEA DX,msg
;INT 21h


end_progr:

MOV AH,9                    ;{А ТУТ НЕ ХОЧЕТ ПЕРЕМЕННУЮ ВЫВОДИТЬ}
lea Dx,buffer
INT 21h

mov ah,10h
INT 16h

mov Ax, 4C00h ;выход
INT 21h
end start


PM MAIL ICQ   Вверх
dumb
Дата 10.12.2008, 20:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


sceloglauxalbifacies
****


Профиль
Группа: Экс. модератор
Сообщений: 2929
Регистрация: 16.6.2006

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




M
dumb
bip, один топик - один вопрос.
и если вопрос решен, помечай тему решенной.


по существу:
http://www.firststeps.ru/asm/ - особо обратить внимание на статейки со словами "Turbo Debugger" в названии.
http://www.ctyme.com/intr/int-21.htm - справочник по функциям 21-го прерывания.
"buffer db ?", упоминаемый в твоих исходниках - это ОДИН байт. изучи хотя бы типы данных для начала.
PM MAIL   Вверх
bip
Дата 10.12.2008, 21:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



dumb,эх.. придётся видимо изучить. 
buffer db ?(buffer db 10 dup(0)) это я что то совсем уж... 
p.s. спасибо за ссылки

Это сообщение отредактировал(а) bip - 10.12.2008, 21:38
PM MAIL ICQ   Вверх
bip
Дата 12.12.2008, 22:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Вот вроде получилось изъять из кмд параметры, но почему-то не получается записать в файл первый параметр-строка, указанное число раз-второй параметр. Не пойму где ошибка...
Код

model small
.stack 80h
.data  
  File_name db "file.txt",0
  BUFFER DB  10 dup(0) ,'$';строка 
  BUFFER2 DB  4 dup(0),'$' 
  msg  DB  "No parametrs!", 13, 10, '$'
  fileHandle dw 0
  m db ?
  .code
  start:
;------------------------------------------------------------------------------------------------------------
  mov   ax, @data
  mov   ds, ax
  mov    cl,es:80h                         ; количество символов     в командной строке
   ;cmp    cl,0
    ;je    no_param                          ; нет параметров - просим  указать параметры
   mov    si,81h              ; со смещением 81h начинается область параметров, метка далеко :(
;------------------------------------------------------------------------------------------------------------
  get_param:
  lods  byte ptr es:[si]                        ; Загружаем в al очередной символ строки параметров                          
  mov di,si
  mov  buffer+di-82h,al                                ; заносим в буффер из al посимвольно
  cmp al,0Dh
  je     end_progr  
  cmp al, ' '
  je     sec_param
  inc bx    
  loop get_param
;------------------------------------------------------------------------------------------------------------
  sec_param:                      
  lods  byte ptr es:[si]                          ; Загружаем в al очередной символ строки параметров                          
  mov di,si
  mov  buffer2+di-82h,al                                 ; заносим в буффер из al посимвольно
  cmp al,0Dh
  je     end_progr  
  inc bx
  loop sec_param
;------------------------------------------------------------------------------------------------------------
 end_progr:     


mov [buffer+bx],'$'                                              ; конец для buffera
LEA DX,BUFFER+bx
MOV AH,9h
INT 21h;
;--------------------------------------------------------------------------------------------------------------
mov [buffer2+bx+1],'$'                                       ; конец для buffera2
LEA DX, BUFFER2
MOV AH,9h
INT 21h;
;------------------------------ ------------------------------------------------------------------------------
    MOV Ax,4E00H ;функция поиска в каталоге
    LEA DX,File_name ;имя для поиска
    INT 21H                          
;-------------------------------------------------------------------------------------------------------------
    MOV Ax,3C00H ;функция создания файла
    MOV CX,0 ;нормальные атрибуты
    INT 21H ;создаем файл
;-------------------------------------------------------------------------------------------------------------
    mov ax,3D01h
     lea dx,File_name
     int 21h;открыл для записи
    mov fileHandle, ax
;-------------------------------------------------------------------------------------------------------------
    mov bx, ax;сохранил номер файла
;--------------------------------------------------------------------------------------------------------------
;--------------------------------------------------------------------------------------------------------------
 xor cx,cx
 mov cl,byte ptr buffer2[4]                    ;заносим в сl байт (код числа от 0 до 9)
 sub cl,'0'                            ;преобразуем в чило
                        ;сохраняем в переменную т.к. cx нужен для цикла label1
 mov m,cl
xor ax,ax
label1:
             
            mov ah,40h
            mov cl,buffer+1
            mov ch,0
            lea dx,buffer+2
            int 21h;записал
            mov cl,m
            dec m
loop label1

;--------------------------------------------------------------------------------------------------------------
 jmp ext                            ;идём на выход
;--------------------------------------------------------------------------------------------------------------
 no_param:
 LEA DX,msg                       ;если нет параметров выводим соответствующее сообщение
 MOV AH,9h
 INT 21h;
;--------------------------------------------------------------------------------------------------------------
 ext:
 mov Ax, 4C00h ;выход
 INT 21h
 end start


PM MAIL ICQ   Вверх
Mikl_
Дата 16.12.2008, 13:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



bip, про отладчик вам преподаватель ничего не говорил? В топике Торреро я приаттачил afd-отладчик -- возьми его и разберись со своей программой

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

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

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


 




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


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

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