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

Discussion in 'WASM.BEGINNERS' started by tower120, Mar 11, 2007.

  1. tower120

    tower120 New Member

    Blog Posts:
    0
    Всем привет!

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

    Code (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

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

    Freeman New Member

    Blog Posts:
    0
  4. tower120

    tower120 New Member

    Blog Posts:
    0
    Пример, пример пожалуйста!!!
     
  5. wasm_test

    wasm_test wasm test user

    Blog Posts:
    0
    давно я под дос не писал =\
    примерно так

    Code (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

    Blog Posts:
    0
    Ээээ... А зачем маска
    Code (Text):
    1. and bp, 0ffh
    ? (может чтобы не обнулять bp? :/)

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

    wasm_test wasm test user

    Blog Posts:
    0
    чтобы выделить только первый байт, т.к. прочитать мы можем в bp минимум слово.

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

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

    tower120 New Member

    Blog Posts:
    0
    Что такое лог консоли я не знаю, а ввожу с такими параметрами (работаю в 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

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

    tower120 New Member

    Blog Posts:
    0
    А потом что опять +10h? И почему нельзя использовать вместо DS ES? ES ведь тоже на начало PSP указывает.

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

    wasm_test wasm test user

    Blog Posts:
    0
    Потому что соседние сегменты расстоят друг от друга на параграф (16 или 10h байт). Если сегменты различаются на 10h, то разница линейных адресов составит 100h, то есть как раз размер PSP.
    Алгоритм -
    mov ax, cs
    sub ax, 10h
    mov ds, ax
    теперь DS:[0] указывает на PSP. В DS:[80h] лежит длина параметров, в DS:[81h] - параметры.
    Окончательно:
    Code (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

    Blog Posts:
    0
    Значит теперь мы перезатрём данные из PSP? Ведь получается, что мы фактически работаем в области памяти отведённой для PSP.
     
  13. n0name

    n0name New Member

    Blog Posts:
    0
    Да. Можешь просто скопировать в переменную. И редактировать уже там.
     
  14. tower120

    tower120 New Member

    Blog Posts:
    0
    Что скопировать? Что редактировать?
     
  15. n0name

    n0name New Member

    Blog Posts:
    0
    Параметры коммандной строки.
    их же
     
  16. wasm_test

    wasm_test wasm test user

    Blog Posts:
    0
    ну подумаешь запишем один '$'. Ничего плохого не будет
     
  17. tower120

    tower120 New Member

    Blog Posts:
    0
    Как это один '$'? У меня же "куча" данных в сегменте данных. Следовательно будет очень плохо. ИМХО :)

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

    wasm_test wasm test user

    Blog Posts:
    0
    так это один. это единственная модификация, которую мы сделаем.
     
  19. tower120

    tower120 New Member

    Blog Posts:
    0
    Всем спасибо! Как ни странно получилось:)... Работал с сегментом es.