Использование оператора в коде мэйнфрейма z390 - PullRequest
1 голос
/ 10 октября 2011

О том, что я использую: я использую переносной мэйнфрейм-ассемблер z390 и эмулятор.

При попытке собрать я получаю сообщение об ошибке "база не найдена".

Я пытался вставить USING *,12, но куда бы я ни положил, это ничего не делает."базовый регистр не найден"

Я пытался применить BASR 12,0; получил ошибку.Я получил:

17:53:44 PROG4     EZ390 EZ390E error  11 ABEND PSW=07050600 800FFCEC F6F6F6F64040 ????? ABEND S0C1
17:53:44 PROG4     EZ390 EZ390E error  12 program aborting due to abend S0C1

Руководство по сборке находится на http://publibz.boulder.ibm.com/epubs/pdf/asmr1020.pdf,, но у меня возникают проблемы с его применением.

Источник, на который я смотрел: http://en.wikipedia.org/wiki/IBM_Basic_assembly_language#Assembler_instructions

Как заставить ассемблер находить базовый регистр?

Обновление: все еще возникают проблемы с базовым регистром.

Дополнительные ресурсы:

www.tradingwiz.net63.net / pdf / Sessions5and6.pdf

www.z390.org / z390_Documentation.htm

        TITLE 'CS 4321 Program #4 by J. Colt Wright' 
        PRINT NOGEN    
COPY          SUBENTRY
    USING *,12
    TITLE 'PROGRAM 4 80/80 LISTING'
    PRINT NOGEN
COPY2 SUBENTRY

    WTO 'PROG4 COPY PROG4 (ASCII) TO COPY (ASCII)'
    OPEN (INFILE,INPUT)
    OPEN (OUTFILE,OUTPUT)
    WTO 'Files opened successfully'
*

LOOP EQU *
    GET INFILE,IRECORD
    MVC ORECORD,=CL80' '
    MVC ORECORD(72),IRECORD
    PUT OUTFILE,ORECORD
    B LOOP
*
EOF EQU *
    CLOSE (INFILE,,OUTFILE)
    WTO 'PROG4 ENDED OK'
    SUBEXIT

    SUBEXIT   


INFILE  DCB     DDNAME=INFILE,                                         X
                DSORG=PS,                                              X
                RECFM=FT,                                              X
                LRECL=72,                                              X
                EODAD=EOF,                                             X
                MACRF=GM
*
OUTFILE DCB     DDNAME=OUTFILE,                                        X
                DSORG=PS,                                              X
                RECFM=FT,                                              X
                LRECL=80,                                              X
                MACRF=PM
*
IRECORD DC    CL72' '
ORECORD DC    CL80' '
ENDPGM  DS D
 END COPY

Я получаю сообщение об ошибке или сообщение об отсутствии базового регистра, в зависимости от того,или нет, я предоставляю COPY2 SUBENTRY.

Я пытаюсь заставить код работать.

У меня есть код, работающий кроме этого.

Ответы [ 3 ]

2 голосов
/ 03 января 2012

Во-первых, вам не нужна COPY SUBENTRY, так как это только помещает копию определения макроса в источник во время обработки первого прохода. Есть моменты, когда вам это может понадобиться (особенно для отладки макросов), но это не один из таких случаев. (SUBENTRY / EXIT распространяются как вспомогательные макросы с z390.)

Я взял вашу программу и удалил операторы PRINT NOGEN. В общем, я не люблю использовать PRINT NOGEN, потому что есть много информации, которую он подавляет, например, инструкции, генерируемые SUBENTRY. В те времена, когда распечатки убивали деревья, вы видели это больше, но теперь, когда списки отправляются на диск, это не имеет большого значения.

Обычно, когда у вас есть входные макросы, такие как SUBENTRY, он устанавливает базовый регистр. Удаление PRINT NOGEN показывает, что на самом деле регистр 13 (или R13 - обычное сокращение на ассемблере) помещается в начало области программы, и использует R13 в качестве базового регистра и инициализирует его. , Случилось так, что вы столкнулись с документированным правилом ассемблера, но не многие его помнят. Правило таково: если адрес покрывается несколькими операторами USING, ассемблер будет использовать регистр с меньшим номером. Ваше ИСПОЛЬЗОВАНИЕ *, 12 в начале охватывает всю программу, что нормально, но оно перекрывает «ИСПОЛЬЗОВАНИЕ КОПИИ2 + 8,13», которое генерирует SUBENTRY.

Так что получается, что ваши области данных покрыты двумя регистрами, и ассемблер выбрал меньшее значение (12). И поскольку вы никогда не загружали значение в R12, оно указывает на то, кто что знает. Поэтому, когда вы пытаетесь получить доступ к данным из этого регистра - бум.

Простое решение состоит в том, чтобы удалить USING *, 12 из вашей программы, и ассемблер генерирует адрес базового смещения из R13. Я сделал это, и он умер, потому что у меня нет входных файлов, но я ожидал этого.

0 голосов
/ 22 ноября 2011

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

Требуется дополнительная информация. Какой базовый регистр ожидает ассемблер? PRINT NOGEN говорит «не показывать инструкции, сгенерированные макросами», и, не видя их, мы не можем сказать, что происходит. PRINT GEN обычно используется по умолчанию и обычно полезен.

Что касается вашего S0C1: значение F6F6F6F64040, отображаемое после PSW, является ключом к пониманию проблемы. Похоже, что добавленная вами инструкция BASR 12,0 вызвала использование недопустимого адреса для базы кода. Во время завершения, регистр 12 адресовал кусок данных со значением F6F6..., первый байт которого (F6) является недействительным кодом операции. Недопустимые коды операций приводят к возникновению аварий S0C1. Такое случается, когда базовым регистрам присваиваются неправильные адреса.

0 голосов
/ 10 октября 2011

Я не использовал z390 (и знаю только немного о сборке 390 в целом), но: SUBENTRY и SUBEXIT должны быть макросами, которые расширяются до декларации CSECT и соответствуют зарегистрируйте тряску для входа / выхода, и поэтому я бы предположил, что вложение COPY2 SUBENTRY ... SUBEXIT в COPY SUBENTRY ... SUBEXIT - действительно плохая идея.

...