Если программа вызывается из задания, то по адресу первого параметра (R1) появляется спереди еще 2 байта длины. Если вызывать из программы, то передается ровно так, как построил параметры. Есть ли общепринятый способ обработки таких различий? Как программа может определить откуда ее вызвали? (чтобы учитывать или неучитывать эти 2 байта)
Хороший вопрос. Пока приходится анализировать первый байт параметров и если там значение какое-нибудь из ожидаемых, то делаю вывод, что вызов был из программы, если нет - то из задания. В NATURAL-e (ADABAS), например, есть системная переменная, анализируя которую понимаешь откуда был вызов.
Как именно рассматриваемая программа вызывается из другой программы? Если динамически (LINK/XCTL/ATTACH,LOAD+CALL), то определить это возможно многими способами, например, проверяя PRB (первый/не первый). Если программа совместно линкуется статически с вызывающей, 100% достоверно определить это нельзя. Но вот только зачем вообще это делать?! У программы есть соглашения по вызову, описывающие вид и форму передаваемых параметров. Вы хотите сделать эти соглашения неоднозначными (если так - то так, а если так - то этак) , а это плохо. И вообще, программа с претензиями на "интеллектуальность" много хуже, чем программа с простыми и понятными функциями, это мое глубокое убеждение... Я не знаю ни одной стандартной программы, котороя бы реализовывала прием параметров подобным образом. См, напрмер, SC26-7343-01 Utilities Appendix A, A.1 Building parameter lists.
Сообщение отредактировал Gregory - Пт, 04.09.2009, 12:04
Учитывая, что программа использует активно длину, возможно ее придется оставить. Однако народ хочет, чтобы некое сообщение в таком случае читалось не из ДД, а по параметру.
Один из вариантов был проверить если в первых 2х байтах не длина (буквы дадут большое число), то зачитать 2й парм. (JCL всегда дает только один парм)
Если оставлять длину, то как поределять? Запихнуть ключевое слово в первый параметр, а остальные сдвинуть?
Однако народ хочет, чтобы некое сообщение в таком случае читалось не из ДД, а по параметру.
В каком "таком"? При вызове из задания? ИЛи при вызове из программы?
Quote
Один из вариантов был проверить если в первых 2х байтах не длина (буквы дадут большое число), то зачитать 2й парм. (JCL всегда дает только один парм)
По общепринятому соглашению старший бит в списке параметров = 1 для последнего параметра, так что определить, сколько параметров передано - один или десять не составляет никакого труда... Снова сошлюсь на SC26-7343-01 Utilities Appendix A, A.1 Building parameter lists. Все стандартные утилиты принимают режимы (options), и только их можно указать при вызове из задания, а при вызове из программы можно указать не только режимы, но и список альтернативных имен DD, управляющие операторы в памяти и начальный номер страницы, то есть один, два, три или 4 слова по адресу в R1. При вызове из REXX/CLIST можно передать список параметров в любом желаемом виде - address LINKMVS, address LINKPGM
Сообщение отредактировал Gregory - Сб, 05.09.2009, 00:29
Программа всю жизнь вызывалась(и будет) из JCL. Мне надо чтобы она еще + могла вызываться из программы.
JCL не ставит старший бит и не передает список ДД. Значит я не могу знать, у меня настоящий адрес в +4 или число с бодуна (получу С4 если полезу). И настоящий там старший бит или случайный...
Так что, только если через PRB. Вопрос - как узнать, что он не первый ?
не стреляет, потому что не заряжено: LINK EP=PROG2,PARAM=(PARM1,PARM2),VL=1 Specify VL=1 if the called program can be passed a variable number of parameters. VL=1 causes the macro to set the high-order of the last address parameter to 1.
Сообщение отредактировал Gregory - Чт, 17.09.2009, 16:49
Добавлено (21.09.2009, 15:42) --------------------------------------------- Где почитать, сколько тактов занимает какая команда ? А то, кроме общих фраз, что RR быстре RX, как то и нет ничего.
Подскажите, как читать из текстового файла с записями переменной длины строчки? Построчно.
Лучше всего использовать макросы (для чтения записи GET). Описание можно найти например здесь: http://publibz.boulder.ibm.com/cgi-bin/bookmgr_OS390/Shelves/DGT2BK61 в книге z/OS V1R8 DFSMS Macro Instructions for Data Sets. Можно эту книгу поискать для других версий, но вряд ли там будут значительные изменения для твоего случая. Примеры использования можно поискать на CBTTAPE (вообще хороший ресурс для обучения). Мне навскидку попалась утилита ALEXCMDS, IEBLIST.
Sha_Lun, есть на русском языке книга Хусаинова древняя, по методам доступа ассемблерным. Она на 80% актуальна, ее можно у букинистов найти. Вечный источник знаний.