как проверить, существует ли путь к файлу или нет - PullRequest
0 голосов
/ 21 января 2019

я новичок в сборке; как проверить, существует ли определенный путь (UNIX) из кода сборки мэйнфрейма IBM. например, я хочу проверить, существует ли путь '/ user / lpd / file' или нет.

На странице IBM есть один пример

     MVC   BUFFERA(19),=CL19'labrec/qual/current'                   
     MVC   BUFLENA,=F'19'                                           
     SPACE ,                                                        
     CALL  BPX1STA,              Get file status                   +
           (BUFLENA,             Input: Pathname length            +
           BUFFERA,              Input: Pathname                   +
           STATL,                Input: Length of buffer needed    +
           STAT,                 Buffer, BPXYSTAT                  +
           RETVAL,               Return value: 0 or -1             +
           RETCODE,              Return code                       +
           RSNCODE),             Reason code                       +
           VL,MF=(E,PLIST)       ---------------------------------- 

Но все же для этого нужно найти вручную длину параметра a

Ответы [ 2 ]

0 голосов
/ 11 апреля 2019

Несколько замечаний, так как я заметил, что у вас нет полных ответов с января ...

Во-первых, если ваша цель - вычислить длину вашего имени файла, чтобы вы могли передать его какпараметр 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 ... в коде ассемблера - это тоже довольно просто.

0 голосов
/ 21 января 2019

Когда я впервые начал изучать HL / ASM, мне было удобно использовать комбинацию Принципов работы и списков компиляторов Си.

Если вы на стороне системных служб Unix, вы можете написать фрагмент кода, например,

foo.c:

#include <stdlib.h>
int foo(const char* str) {
  return strlen(str);
}

и затем скомпилируйте этот код как:

c89 -c -Wc, список (./) foo.c

, а затем посмотрите, как компилятор сгенерировал код. Вы также можете попробовать -O2, чтобы увидеть, как оптимизатор может это сделать. Будьте осторожны, чтобы не позволить оптимизатору «делать слишком много», например, не позволяйте ему видеть фактическую строку, иначе он просто вычислит длину во время компиляции

...