Несколько замечаний, так как я заметил, что у вас нет полных ответов с января ...
Во-первых, если ваша цель - вычислить длину вашего имени файла, чтобы вы могли передать его какпараметр stat () (или BPX1STA), тогда у вас есть несколько других проблем в вашем примере кода.
Вы думаете, что хотите использовать функцию strlen (), которую действительно легко реализовать в ассемблере с помощью инструкции zSeries «SEARCH STRING» (или SRST), но вам не хватает одного ключевого ингредиента, чтобы это работало ...Строки в стиле C работают, потому что они заканчиваются нулем, и в вашем коде, где у вас есть:
MVC BUFFERA(19),=CL19'labrec/qual/current'
, не обязательно есть нулевой терминатор, поэтому strlen не собираетсячтобы дать вам то, что вы ожидаете (в зависимости от того, что следует за этой константой в памяти).Вы выделили строку из 19 символов, и все, что следует за ней, является функцией того, что будет дальше в вашем коде.
Лучшим способом было бы закодировать его с помощью более длинного буфера, например:
BUFFERA DC 1024C' '
Тогда вы будете настроены на обработку последовательности, такой как перемещение строки в эту область ивычисление его длины с помощью чего-то типа SRST.
В примере IBM такой проблемы нет, потому что BPX1STA не требует строк с нулевым символом в конце, поэтому они пропустили идею динамического вычисления длины и просто показываютжестко закодированное значение.Если вы хотите сделать его немного более динамичным, вам, вероятно, нужно сделать что-то вроде выделения произвольно длинного буфера (имена файлов служб UNIX могут иметь длину 1024 байта), установить для буфера значение null, скопировать нужный текст - и затем выможно получить длину с SRST и небольшое вычитание.Это не очень сложно.
Альтернативой является то, что во многих случаях проще вызывать функцию времени выполнения C, чем соответствующую службу ассемблера BPX1 ....В ассемблере задача состоит в том, чтобы сделать ваш код LE-совместимым, но как только вы сделаете это (и это легко), вы можете просто вызвать «stat ()», как это сделал бы C-программист.В этом случае вы просто передадите ему имя файла с нулевым символом в конце и адрес выходного буфера, и функция времени выполнения сделает всю работу.
Если вы свободно говорите на C, простой способ написать LE-совместимый ассемблер - написать короткий "main ()" на C и заставить его вызывать ваш ассемблерный код ... таким образом, всенастройка LE выполняется для вас заранее, и все, что доступно во время выполнения C, теперь доступно вам на ассемблере.Другой вариант - просто кодировать различные макросы CEE ... в коде ассемблера - это тоже довольно просто.