Всем привет! Мне надо узнать аргумент командной строки (то что после имени и пути экзешника) в ТАSM. Очень желателен пример. Где то читал, что вроде хранится в PSP:0080h, дебагер иногда действительно показывает аргументы по этому адресу. А вот этот кусок кода, хрень какую-то выдаёт: Code (Text): ;===çàãðóçêà è çàïóñê ïðîãðàìû=== DATA SEGMENT ;---â ñåãìåíòå äàííûõ FILENAME DB 'D:\lab3d.exe',0 ;çàãðóæàåì TRIAL.EXE PARAMETERS DW 7 DUP(0) ;íóëåâîé áëîê ïàðàìåòðîâ KEEP_SS DW 0 ;ïåðåìåííàÿ äëÿ SS KEEP_SP DW 0 ;ïåðåìåííàÿ äëÿ SP DATA ENDS STK SEGMENT STACK ;ñåãìåíò ñòåêà DB 128 DUP(?) STK ENDS CODE SEGMENT ;ñåãìåíò êîäà ASSUME DS:DATA,CS:CODE,SS:STK; ñâÿçóåì ðåãèñòðû ñ ñåãìåíòàìè OUTPUTPROC MOV AH,40h MOV BX,01h MOV CX,10 mov DX,80h INT 21h RET OUTPUT ENDP START: MOV AX,DATA ;çàãðóæàåì â DS íà÷àëüíûé àäðåñ DATA MOV DS,AX ;---îïðåäåëÿåì àðãóìåíòû êîìàíäíîé ñòðîêè------------- call output ;---âîçâðàùàåìñÿ â ÄÎÑ--------- MOV AX,4C00H INT 21H CODE ENDS END START З.Ы. Сорри за кодировку...
не совсем. по асмещению 80 хранится байт с длиной строки параметров, а уж по адресу 81 - сама строка. и, чтобы дос показала строчку нормально, ей надо в конце указать символ "$".
давно я под дос не писал =\ примерно так Code (Text): ; забираем байт по адресу 80 - длина xor bp, bp mov bp, [80h] and bp, 0ffh ; записываем '$' mov byte ptr [bp+81], '$' ; выводим несчастные параметры mov dx, 80h mov ah, 9 int 21h ; уходим по-джентельменски=\ int 20h
Ээээ... А зачем маска Code (Text): and bp, 0ffh ? (может чтобы не обнулять bp? :/) Попробовал... Не поверите, но та же фигня.
чтобы выделить только первый байт, т.к. прочитать мы можем в bp минимум слово. зы. xor bp,bp лишнее там получается) я ступил цитируй полный вывод. покажи лог с консоли с какими параметрами ты ее вызываешь и что выводит
Что такое лог консоли я не знаю, а ввожу с такими параметрами (работаю в FAR'e): timer.exe kjhskdjfkjh В результате: D:\...рактика семестр 3\ASM86\Курсовая>timer.exe kjhskdjfkjh Ь А § А А Ь♣М♣¶ ж♣☻2↔ 3э╜А Бх ╞FQ З.Ы. Я ещё заметил что в Turbo Debugger'e в этих адресах та же фигня (ещё бы). А вот когда запускаю мелкософтский дебагер после завершения работы проги, так тот мне всё правильно пишет. Надо отдать должное Turbo Debugger тоже, но только до тех пор пока не начнёш трасировку. З.Ы.Ы поставил в коде [es:80h] вместо [80h] проблемы с дебагером пропали. Осталось разобраться со всем остальным
Я совсем не заметил, у тебя сегментные регистры неправильные. Загрузи в DS сегмент кода CS и вычти из него 10h. Тогда DS будет указывать на начало PSP. А так у тебя он указывает на DATA, где по смещению 80 лежит какая-то херня )
А потом что опять +10h? И почему нельзя использовать вместо DS ES? ES ведь тоже на начало PSP указывает. З.Ы. И почему именно 10h?
Потому что соседние сегменты расстоят друг от друга на параграф (16 или 10h байт). Если сегменты различаются на 10h, то разница линейных адресов составит 100h, то есть как раз размер PSP. Алгоритм - mov ax, cs sub ax, 10h mov ds, ax теперь DS:[0] указывает на PSP. В DS:[80h] лежит длина параметров, в DS:[81h] - параметры. Окончательно: Code (Text): ; DS -> PSP mov ax, cs sub ax, 10h mov ds, ax ; забираем байт по адресу 80 - длина mov bp, ds:[80h] and bp, 0ffh ; записываем '$' mov byte ptr ds:[bp+81h], '$' ; выводим несчастные параметры mov dx, 81h mov ah, 9 int 21h ; уходим по-джентельменски=\ int 20h У меня оно РАБОТАЕТ =) Так что .. ) Кстати я совсем забыл в прошлом примере, что при использовани BP для адресации используется сегмент SS, а нам нужен DS, поэтому надо явно переназначить сегмент в команде mov byte ptr ds:[bp+81h], '$'. Это очень важный момент
Значит теперь мы перезатрём данные из PSP? Ведь получается, что мы фактически работаем в области памяти отведённой для PSP.
Как это один '$'? У меня же "куча" данных в сегменте данных. Следовательно будет очень плохо. ИМХО А вот насчёт скопировать аргументы командной строки - вот это дельное предложение... Ща попробую........