аргументы командной строки

Тема в разделе "WASM.BEGINNERS", создана пользователем tower120, 11 мар 2007.

  1. tower120

    tower120 New Member

    Публикаций:
    0
    Регистрация:
    11 мар 2007
    Сообщения:
    56
    Всем привет!

    Мне надо узнать аргумент командной строки (то что после имени и пути экзешника) в ТАSM. Очень желателен пример. Где то читал, что вроде хранится в PSP:0080h, дебагер иногда действительно показывает аргументы по этому адресу. А вот этот кусок кода, хрень какую-то выдаёт:

    Код (Text):
    1. ;===çàãðóçêà è çàïóñê ïðîãðàìû===
    2. DATA SEGMENT
    3.       ;---â ñåãìåíòå äàííûõ
    4.       FILENAME     DB   'D:\lab3d.exe',0  ;çàãðóæàåì TRIAL.EXE
    5.       PARAMETERS   DW   7 DUP(0)          ;íóëåâîé áëîê ïàðàìåòðîâ
    6.       KEEP_SS      DW   0                ;ïåðåìåííàÿ äëÿ SS
    7.       KEEP_SP      DW   0                ;ïåðåìåííàÿ äëÿ SP
    8. DATA ENDS    
    9.  
    10. STK SEGMENT STACK     ;ñåãìåíò ñòåêà
    11.    DB 128 DUP(?)
    12. STK ENDS
    13.  
    14. CODE SEGMENT  ;ñåãìåíò êîäà
    15.    ASSUME DS:DATA,CS:CODE,SS:STK;   ñâÿçóåì ðåãèñòðû ñ ñåãìåíòàìè
    16.  
    17. OUTPUTPROC
    18.       MOV AH,40h
    19.       MOV BX,01h
    20.       MOV CX,10
    21.       mov DX,80h
    22.       INT 21h
    23.       RET
    24. OUTPUT  ENDP
    25.  
    26. START:
    27.    MOV AX,DATA  ;çàãðóæàåì â DS íà÷àëüíûé àäðåñ DATA
    28.    MOV DS,AX
    29.  
    30. ;---îïðåäåëÿåì àðãóìåíòû êîìàíäíîé ñòðîêè-------------
    31.    call output
    32.  
    33. ;---âîçâðàùàåìñÿ â ÄÎÑ---------
    34.    MOV AX,4C00H
    35.    INT 21H
    36.  
    37. CODE ENDS
    38.  
    39. END START
    З.Ы. Сорри за кодировку...
     
  2. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    не совсем. по асмещению 80 хранится байт с длиной строки параметров, а уж по адресу 81 - сама строка.
    и, чтобы дос показала строчку нормально, ей надо в конце указать символ "$".
     
  3. Freeman

    Freeman New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2005
    Сообщения:
    1.385
    Адрес:
    Ukraine
  4. tower120

    tower120 New Member

    Публикаций:
    0
    Регистрация:
    11 мар 2007
    Сообщения:
    56
    Пример, пример пожалуйста!!!
     
  5. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    давно я под дос не писал =\
    примерно так

    Код (Text):
    1. ; забираем байт по адресу 80 - длина
    2. xor bp, bp
    3. mov bp, [80h]
    4. and bp, 0ffh
    5.  
    6. ; записываем '$'
    7. mov byte ptr [bp+81], '$'
    8.  
    9. ; выводим несчастные параметры
    10. mov dx, 80h
    11. mov ah, 9
    12. int 21h
    13.  
    14. ; уходим по-джентельменски=\
    15. int 20h
     
  6. tower120

    tower120 New Member

    Публикаций:
    0
    Регистрация:
    11 мар 2007
    Сообщения:
    56
    Ээээ... А зачем маска
    Код (Text):
    1. and bp, 0ffh
    ? (может чтобы не обнулять bp? :/)

    Попробовал... Не поверите, но та же фигня.
     
  7. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    чтобы выделить только первый байт, т.к. прочитать мы можем в bp минимум слово.

    зы. xor bp,bp лишнее там получается) я ступил

    цитируй полный вывод. покажи лог с консоли с какими параметрами ты ее вызываешь и что выводит
     
  8. tower120

    tower120 New Member

    Публикаций:
    0
    Регистрация:
    11 мар 2007
    Сообщения:
    56
    Что такое лог консоли я не знаю, а ввожу с такими параметрами (работаю в FAR'e):
    timer.exe kjhskdjfkjh
    В результате:

    D:\...рактика семестр 3\ASM86\Курсовая>timer.exe kjhskdjfkjh
    Ь А § А А Ь♣М♣¶ ж♣☻2↔ 3э╜А Бх ╞FQ

    З.Ы. Я ещё заметил что в Turbo Debugger'e в этих адресах та же фигня (ещё бы). А вот когда запускаю мелкософтский дебагер после завершения работы проги, так тот мне всё правильно пишет. Надо отдать должное Turbo Debugger тоже, но только до тех пор пока не начнёш трасировку.

    З.Ы.Ы поставил в коде [es:80h] вместо [80h] проблемы с дебагером пропали. Осталось разобраться со всем остальным :)
     
  9. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Я совсем не заметил, у тебя сегментные регистры неправильные.
    Загрузи в DS сегмент кода CS и вычти из него 10h. Тогда DS будет указывать на начало PSP. А так у тебя он указывает на DATA, где по смещению 80 лежит какая-то херня )
     
  10. tower120

    tower120 New Member

    Публикаций:
    0
    Регистрация:
    11 мар 2007
    Сообщения:
    56
    А потом что опять +10h? И почему нельзя использовать вместо DS ES? ES ведь тоже на начало PSP указывает.

    З.Ы. И почему именно 10h?
     
  11. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Потому что соседние сегменты расстоят друг от друга на параграф (16 или 10h байт). Если сегменты различаются на 10h, то разница линейных адресов составит 100h, то есть как раз размер PSP.
    Алгоритм -
    mov ax, cs
    sub ax, 10h
    mov ds, ax
    теперь DS:[0] указывает на PSP. В DS:[80h] лежит длина параметров, в DS:[81h] - параметры.
    Окончательно:
    Код (Text):
    1. ; DS -> PSP
    2. mov ax, cs
    3. sub ax, 10h
    4. mov ds, ax
    5.  
    6. ; забираем байт по адресу 80 - длина
    7. mov bp, ds:[80h]
    8. and bp, 0ffh
    9.  
    10. ; записываем '$'
    11. mov byte ptr ds:[bp+81h], '$'
    12.  
    13. ; выводим несчастные параметры
    14. mov dx, 81h
    15. mov ah, 9
    16. int 21h
    17.  
    18. ; уходим по-джентельменски=\
    19. int 20h
    У меня оно РАБОТАЕТ =) Так что .. )

    Кстати я совсем забыл в прошлом примере, что при использовани BP для адресации используется сегмент SS, а нам нужен DS, поэтому надо явно переназначить сегмент в команде mov byte ptr ds:[bp+81h], '$'. Это очень важный момент
     
  12. tower120

    tower120 New Member

    Публикаций:
    0
    Регистрация:
    11 мар 2007
    Сообщения:
    56
    Значит теперь мы перезатрём данные из PSP? Ведь получается, что мы фактически работаем в области памяти отведённой для PSP.
     
  13. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    Да. Можешь просто скопировать в переменную. И редактировать уже там.
     
  14. tower120

    tower120 New Member

    Публикаций:
    0
    Регистрация:
    11 мар 2007
    Сообщения:
    56
    Что скопировать? Что редактировать?
     
  15. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    Параметры коммандной строки.
    их же
     
  16. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    ну подумаешь запишем один '$'. Ничего плохого не будет
     
  17. tower120

    tower120 New Member

    Публикаций:
    0
    Регистрация:
    11 мар 2007
    Сообщения:
    56
    Как это один '$'? У меня же "куча" данных в сегменте данных. Следовательно будет очень плохо. ИМХО :)

    А вот насчёт скопировать аргументы командной строки - вот это дельное предложение... Ща попробую........
     
  18. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    так это один. это единственная модификация, которую мы сделаем.
     
  19. tower120

    tower120 New Member

    Публикаций:
    0
    Регистрация:
    11 мар 2007
    Сообщения:
    56
    Всем спасибо! Как ни странно получилось:)... Работал с сегментом es.