Ассемблер Z390, первое кодирование

Итак, я пытаюсь изучить ассемблер и использую z390 в качестве эмулятора (не мой выбор), и у меня большие трудности. Я надеялся на некоторую помощь, потому что у меня много ошибок.

Вот задание: назначение

Итак, я попробовал это в колледже и получил следующее:

FIRST    CSECT
         BALR  12,0
         USING BASE,12
* FIRST VOLUME BEING CALCULATED ------------------------
         L     R2,L1         STORE L1 IN REG 2.
         L     R3,W1         STORE W1 IN REG 3.
         L     R4,H1         STORE H1 IN REG 4.
         MR    R1,3          MUTIPLY CONTENTS OF REG 2. BY REG 3. STORE CONTENTS IN REG 2.
         M     R1,H1         MUTIPLY CONTENTS OF REG 2. BY H1.    
         ST    R2,VOL1       STORE RESULT OF VOLUME IN VOL1.
* SECOND VOLUME BEING CALCULATED ------------------------
         L     R2,L1         STORE L1 IN REG 2.(UNCHANGED FROM BEFORE)
         M     R1,DBL        DOUBLES REG 2. VALUE
         ST    R2,L2         STORE DOUBLED LENGTH IN L2
         M     R2,DBL        DOUBLES REG 3. VALUE
         ST    R3,W2         STORE DOUBLED WIDTH IN W2
         M     R3,DBL        DOUBLES REG 4. VALUE
         ST    R4,H2         STORE DOUBLED HEIGHT IN H2
         MR    R1,3          MUTIPLY CONTENTS OF REG 2. BY REG 3. STORE CONTENTS IN REG 2.
         M     R1,H2         MUTIPLY CONTENTS OF REG 2. BY H1.    
         ST    R2,VOL2       STORE RESULT OF VOLUME(DOUBLED) IN VOL2.
* DIFF. BETWEEN BOTH ------------------------
         L     R2,VOL1      LOAD VOL1 INTO REG. 2.
         S     R2,VOL2      SUBTRACT R2 FROM VOL2.
         ST    R2,DIF       STORE THE RESULT.
* LABLES ------------------------
L1       DC    F'2'         LENGTH - 2
W1       DC    F'2'         WIDTH - 2
H1       DC    F'2'         HEIGHT - 2
DBL      DC    F'2'         CONSTANT TO DOUBLE ALL VALUES.
VOL1     DS    F            STORES VOLUME 1. - NON DOUBLED.
VOL2     DS    F            STORES VOLUME 2. - DOUBLED.
L2       DS    F            DOUBLED LENGTH
W2       DS    F            DOUBLED WIDTH
H2       DS    F            DOUBLED HEIGHT
DIF      DS    F            DIFF. BETWEEN VOL1 AND VOL2
*
*

Так что я подумал, что это все, потому что я понимаю концепцию всего здесь, но Z390 выдает мне этот вывод:

Enter command or help
Microsoft Windows [Version 6.1.7601]
Copyright (c) 2009 Microsoft Corporation.  All rights reserved.
*** 02/06/17 18:26:24 CMD task started
C:\Program Files (x86)\Automated Software Tools\z390>CD \Program Files (x86)\Automated Software Tools\z390\
C:\Program Files (x86)\Automated Software Tools\z390>ASMLG "C:\Users\Owner\Desktop\New folder\SHELL" TRACE CON
C:\Program Files (x86)\Automated Software Tools\z390>rem asmlg assemble, link, and go from mlc to 390 execution 
C:\Program Files (x86)\Automated Software Tools\z390>echo off 
18:26:24 SHELL     MZ390 START USING z390 V1.5.06 ON J2SE 1.8.0_73 02/06/17
AZ390E error  98         (1/3)3      USING BASE,12
AZ390E error 198         (1/5)5            L     R2,L1         STORE L1 IN REG 2.
AZ390E error 198         (1/6)6            L     R3,W1         STORE W1 IN REG 3.
AZ390E error 198         (1/7)7            L     R4,H1         STORE H1 IN REG 4.
AZ390E error 198         (1/8)8            MR    R1,3          MUTIPLY CONTENTS OF REG 2. BY REG 3. STORE
AZ390E error 198         (1/9)9            M     R1,H1         MUTIPLY CONTENTS OF REG 2. BY H1.
AZ390E error 198       (1/10)10            ST    R2,VOL1       STORE RESULT OF VOLUME IN VOL1.
AZ390E error 198       (1/12)12            L     R2,L1         STORE L1 IN REG 2.(UNCHANGED FROM BEFORE)
AZ390E error 198       (1/13)13            M     R1,DBL        DOUBLES REG 2. VALUE
AZ390E error 198       (1/14)14            ST    R2,L2         STORE DOUBLED LENGTH IN L2
AZ390E error 198       (1/15)15            M     R2,DBL        DOUBLES REG 3. VALUE
AZ390E error 198       (1/16)16            ST    R3,W2         STORE DOUBLED WIDTH IN W2
AZ390E error 198       (1/17)17            M     R3,DBL        DOUBLES REG 4. VALUE
AZ390E error 198       (1/18)18            ST    R4,H2         STORE DOUBLED HEIGHT IN H2
AZ390E error 198       (1/19)19            MR    R1,3          MUTIPLY CONTENTS OF REG 2. BY REG 3. STORE
AZ390E error 198       (1/20)20            M     R1,H2         MUTIPLY CONTENTS OF REG 2. BY H1.
AZ390E error 198       (1/21)21            ST    R2,VOL2       STORE RESULT OF VOLUME(DOUBLED) IN VOL2.
AZ390E error 198       (1/23)23            L     R2,VOL1      LOAD VOL1 INTO REG. 2.
AZ390E error 198       (1/24)24            S     R2,VOL2      SUBTRACT R2 FROM VOL2.
AZ390E error 198       (1/25)25            ST    R2,DIF       STORE THE RESULT.
18:26:25 SHELL     MZ390 ENDED   RC=12 SEC= 0 MEM(MB)= 38 IO=232
Press any key to continue . . . 
C:\Program Files (x86)\Automated Software Tools\z390>exit
*** 02/06/17 18:26:25 CMD task ended TOT SEC=1 TOT LOG IO=30

Итак, я целый час пытался понять, что я делаю неправильно, и поэтому я обращаюсь к вам, ребята / девочки. Так что, черт возьми, я делаю неправильно?

Обновленный код, по-прежнему возникают ошибки в строке 9,20?

FIRST    CSECT
         BALR  12,0
         USING BASE,12
BASE     L     3,L1         R3 = LENGTH OF BOX.
         L     5,W1         R5 = WIDTH OF BOX.
         L     7,H1         R7 = HEIGHT OF BOX.
         MR    2,5          HEIGHT OF BOX X WIDTH OF BOX.
         M     2,H1         RESULT OF MUTIPLY X HEIGHT OF BOX.    
         ST    3,VOL1       R2 = ALL HEIGHT X WIDTH X HEIGHT.

         L     3,L1         R3 = LENGTH OF BOX.
         M     2,DBL        MUTIPLY LENGTH OF BOX BY 2.
         ST    3,L2         R3 = LENGTH OF BOX X 2. 
         M     4,DBL        MUTIPLY WIDTH OF BOX BY 2.
         ST    5,W2         R5 = WIDTH OF BOX BY 2.
         M     6,DBL        MUTIPLY HEIGHT OF BOX BY 2
         ST    7,H2         R7 = HEIGHT OF BOX X 2
         MR    2,5          MUTIPLY LENGTH OF BOX (DOUBLED) BY WIDTH OF BOX(DOUBLED)
         M     2,H2         MUTIPLY RESULT BY HEIGHT OF BOX (DOUBLED)   
         ST    3,VOL2       R3 = LENGTH X WIDTH X HEIGHT
         L     3,VOL2       R3 = VOLUME OF FIRST BOX.
         S     3,VOL1       FIRST VOLUME - SECOND VOLUME(DOUBLED)
         ST    3,DIF        R3 = DIFF. BETWEEN VOLUMES.
L1       DC    F'2'         LENGTH = 2
W1       DC    F'2'         WIDTH = 2
H1       DC    F'2'         HEIGHT = 2
DBL      DC    F'2'         CONSTANT VALUE = 2
VOL1     DS    F            STORAGE FOR FIRST VOLUME (NON-DOUBLED)
VOL2     DS    F            STORAGE FOR SECOND VOLUME (DOUBLED)
L2       DS    F            LENGTH(DOUBLED)
W2       DS    F            WIDTH(DOUBLED)
H2       DS    F            HEIGHT(DOUBLED)
DIF      DS    F            STORAGE FOR DIFFERNCE IN VOLUMES.
*
*
         END   FIRST

(Обновлено с лучшими комментариями, предложенными пользователем.)

Новая ошибка???

16:08:37 SHELL     EZ390 START USING z390 V1.5.06 ON J2SE 1.8.0_73 02/08/17
EZ390I Copyright 2011 Automated Software Tools Corporation
EZ390I z390 is licensed under GNU General Public License
EZ390I program = C:\Users\Owner\Desktop\New folder\SHELL.390
EZ390I options = 
EZ390I Trace Table Entry      800FFFB0 5050C066     ST   
EZ390I Trace Table Entry      800FFFB4 5C60C056     M    
EZ390I Trace Table Entry      800FFFB8 5070C06A     ST   
EZ390I Trace Table Entry      800FFFBC 1C25         MR   
EZ390I Trace Table Entry      800FFFBE 5C20C06A     M    
EZ390I Trace Table Entry      800FFFC2 5030C05E     ST   
EZ390I Trace Table Entry      800FFFC6 5830C05E     L    
EZ390I Trace Table Entry      800FFFCA 5B30C05A     S    
EZ390I Trace Table Entry      800FFFCE 5030C06E     ST   
EZ390E error  11 ABEND PSW=07052600 800FFFD2 F6F600000002 ????? ABEND S0C1
 R0-R3 F4F4F4F4800FFF88 F4F4F4F400002300 F4F4F4F400000000 F4F4F4F400000038
 R4-R7 F4F4F4F400000000 F4F4F4F400000004 F4F4F4F400000000 F4F4F4F400000004
 R8-RB F4F4F4F4F4F4F4F4 F4F4F4F4F4F4F4F4 F4F4F4F4F4F4F4F4 F4F4F4F4F4F4F4F4
 RC-RF F4F4F4F4800FFF8A F4F4F4F400002100 F4F4F4F400002018 F4F4F4F4800FFF88
EZ390E error  12 program aborting due to abend S0C1
EZ390I instructions/sec     = 333
EZ390I total errors         = 1
16:08:37 SHELL     EZ390 ENDED   RC=16 SEC= 0 MEM(MB)= 18 IO=37 INS=21

person Frank    schedule 06.02.2017    source источник
comment
Что за строка 9,22? Можете выложить лист сборки?   -  person Yuri Steinschreiber    schedule 07.02.2017
comment
Нужно видеть сообщение об ошибке и строку. У вас нет выхода из вашего кода, поэтому управление будет касаться ваших констант и данных, так что будут происходить захватывающие вещи. У вас нет сохранения регистров вызывающей программы (ОС). Ваши комментарии требуют много работы. Суть не в том, чтобы описать инструкции, а в том, что вы делаете (чтобы следующий человек знал, что вы пытаетесь сделать). Просто описать и описать как загрузку, так и сохранение как сохранение, ничего не делает.   -  person Bill Woodger    schedule 07.02.2017
comment
Это моя первая попытка написать какой-либо код на ассемблере, я программист высокого уровня, поэтому для меня это странная концепция, я поработаю над своими комментариями, спасибо. Строки 9 и 20* (не 22) выглядят следующим образом: M 2,H1 MUTIPLY CONTENTS OF REG 3. BY H1. M 2,H2 MUTIPLY CONTENTS OF REG 3. BY H1. Ошибка в обеих строках: MZ390E error 11   -  person Frank    schedule 07.02.2017
comment
Я прокомментировал свой код немного более подробно, пожалуйста, не стесняйтесь давать мне более конструктивную критику!   -  person Frank    schedule 07.02.2017
comment
@Frank Как говорит Билл, «ЗАГРУЗИТЬ ЗНАЧЕНИЕ L1 В REG 3» — плохой комментарий — мы это видим. Хороший комментарий: «R3 = длина коробки». Также вы можете использовать лучшие метки (переменные), например. используйте length1 вместо L1, volume1 вместо VOL1   -  person Steve Ives    schedule 07.02.2017
comment
О, я полностью понимаю, что вы сейчас говорите. Спасибо за дальнейшее развитие идеи Билла!   -  person Frank    schedule 07.02.2017
comment
@Steve/ @Bill - снова обновил мои комментарии, дайте мне знать, что вы, ребята, думаете!   -  person Frank    schedule 07.02.2017
comment
Комментарии значительное улучшение. Одна вещь, на которую стоит обратить внимание, — это колонка продолжения. Ваши самые длинные комментарии переместились в столбец 72 (или выше), и это, поскольку продолжения строги в формате продолжающихся строк, дает вам ошибку 11.   -  person Bill Woodger    schedule 07.02.2017
comment
У вас еще нет конца вашей программе. Как только вы получите чистую сборку, у вас будут проблемы с исполнением. Вы должны начать новый вопрос, если вам нужна помощь в этом.   -  person Bill Woodger    schedule 07.02.2017
comment
О проблеме с продолжением сообщается для строки продолжения (поскольку именно в этой строке неправильный формат, ассемблер не знает, что указание на продолжение было ошибкой), поэтому строка с ошибкой является предыдущей.   -  person Bill Woodger    schedule 07.02.2017
comment
И если вам не хватает места для комментария, не используйте продолжение. Просто начните следующую строку со звездочки в первом столбце, а затем пробелов, чтобы выровнять начальную часть комментария. Втыкайте такие блоки там, где это необходимо. В комментариях должно быть указано, что я думаю, что я делаю, а в коде указано, что я действительно делаю. Имея много разных способов что-то закодировать, простое повторение ассемблерного кода словами ни для кого ничего не раскрывает (что может быть и для вас, когда вы посмотрите на код позже).   -  person Bill Woodger    schedule 07.02.2017
comment
Я исправил строки 9 и 20, но теперь компилятор выдает мне НОВУЮ ошибку, и я просто понятия не имею. Это после ST, но после этого ничего нет, просто объявляются переменные?? Проверьте новый обновленный код ^ Я не могу понять это.   -  person Frank    schedule 09.02.2017
comment
Теперь у вас есть чистая сборка, и программа выполняется. Как я уже говорил, я думаю, вам нужен новый вопрос. Ответ на то, что происходит, уже содержится в моих предыдущих комментариях дважды. Что после ST в памяти? Как вы собираетесь вернуть вашу программу обратно в операционную систему. S0C1 — это исключение операции. Попытка выполнить что-то, что не является допустимой машинной инструкцией.   -  person Bill Woodger    schedule 09.02.2017
comment
Есть разница между компилятором и ассемблером. В ассемблере каждый OP-код и его параметры просто преобразуются в машинные инструкции. Каждому определению хранилища со значением просто присваивается это значение. OP-коды и хранилище просто прижимаются друг к другу. Компилятор берет материал высокого уровня и генерирует материал более низкого уровня (машинный код или промежуточный код). Вы используете ассемблер для написания кода. Он просто появляется именно так, как вы его кодируете. Вы должны кодировать для всего, хотя есть некоторые макросы (которые просто генерируют код), чтобы помочь.   -  person Bill Woodger    schedule 09.02.2017
comment
У меня есть решение, ребята. На самом деле это была проблема с оболочкой, предоставленной моим инструктором, я написал ему об этом по электронной почте, и он исправил ее. Я поместил свой код в новую оболочку, и это сработало. Я действительно ценю всю вашу помощь, ребята, и конструктивную критику. В Shell был выход для программы и все, что мы еще не узнали, что он предоставил.   -  person Frank    schedule 09.02.2017


Ответы (2)


Я вижу, что вы забыли поставить выход на вашу программу. Инструкции выполнялись последовательно, и ST 3,DIF была последней допустимой инструкцией. После этого у вас есть некоторый DC, который в основном представляет собой данные. Когда ЦП выполняет операцию сохранения, упомянутую выше, он выбирает следующую по порядку инструкцию и находит константу, что приводит к аварийному завершению OC1 или, проще говоря, исключению недопустимой операции. После ST 3,DIF вы должны вернуть управление операционной системе, выполнив макроинструкцию RETURN.

person Eduardo Pereira    schedule 18.04.2021

На данный момент у меня не установлен z390, поэтому я не могу сказать вам, как заставить его печатать более содержательные сообщения об ошибках, но, глядя на ваш код, я сразу вижу, что:

  • BASE не определен (способ, которым вы устанавливаете адресацию, должен следовать за BALR 12,0)

  • R1, R2 и т. д. не определены (вам нужна серия операторов R1 EQU 1, R2 EQU 2 и т. д.).

Вероятно, вам нужно потратить немного больше времени на изучение значения имен в ассемблере.

person Yuri Steinschreiber    schedule 07.02.2017
comment
Что, если бы я не использовал R1 и тому подобное, а вместо этого просто использовал числа? L 1,L1 который должен загрузить L1 в регистр 1 из-за формата RX, верно? - person Frank; 07.02.2017
comment
Также я думаю, что понимаю, что вы имели в виду, поэтому я добавил это: BASE L 2,L1 STORE L1 IN REG 2. - person Frank; 07.02.2017
comment
Да, вам не нужно использовать символические имена для регистров — числа тоже работают. - person Yuri Steinschreiber; 07.02.2017
comment
Итак, в этом случае я исправил все свои ошибки до сих пор. У меня остались только строки 9 и 20 для функции умножения. Я понимаю всю эту четную/нечетную пару и то, как она применяется к умножению в ассемблере. Итак, если мое одно число находится вRegister 2, а мое другое - это переменная, хранящаяся в H1, то почему я не могу сделать M 1,H1 без того, чтобы это не привело к ошибке? - person Frank; 07.02.2017
comment
Да, вам нужна пара четных/нечетных регистров, то есть регистр, указанный вами в инструкции, должен быть четным, а весь операнд находится в четном регистре и следующем за ним нечетном регистре. Так, например, используйте регистры 0 и 1 - нулевой регистр 0, загрузите свой операнд размером в слово в регистр 1 и используйте M 0,H1 - person Yuri Steinschreiber; 07.02.2017
comment
Итак, как мне работать с этим для регистра 2, поскольку это уже четный регистр? Или это невозможно? - person Frank; 07.02.2017
comment
Вам не нужно обнулять четный регистр, это просто чрезмерная защита. - person Yuri Steinschreiber; 07.02.2017
comment
Нет, это невозможно. Множимое должно стоять в нечетном регистре. Прочтите Принципы работы, это очень ясное изложение. - person Yuri Steinschreiber; 07.02.2017
comment
Я разместил свой обновленный код, но все еще получаю ошибки? идеи?? Большое спасибо за помощь, серьезно! - person Frank; 07.02.2017