Apr. 19th, 2021

spamsink: (Default)
[personal profile] spamsink
Как мы все знаем™ в юниксных ассемблерах существует возможность вводить локальные метки, обозначаемые цифрами, и ссылаться на ближайшую метку с данной цифрой, дополнительно указывая после цифры b или f, что значит "назад" и "вперёд".

Например,
0:
    movzwl  (r9)+,r0        # empty entry?
    beql    2f              # yes, skip it
    clrl    r1
1:  cmpb    (r9)[r1],bootname[r1]   # MicroVAX II doesn't have cmpc
    bneq    2f
    aoblss  $DIRSIZ,r1,1b
    brb diryes          # the name we want

2:  acbw    $FSBSIZE-1,$DIRSIZ,r9,0b


Цифры для меток можно было переиспользовать сколько угодно раз.

Таким образом можно было заботиться о придумывании гораздо меньшего количества имён для меток. Похожая по духу фича была и в DEC-овском ассемблере, а вот в IBM-овском ничего подобного не было, потому что считалось, что с помощью макросов можно сделать что угодно.

Предлагается задача: реализовать на макроассемблере IBM/360 (он же БЕМШ) локальные метки в стиле юниксных, так, чтобы можно было писать, например,
0   МЕТ
...
    МПО    0,b   запятая для удобства разбора аргументов макро
...
    МПБ    1,f 
...
1   МЕТ
...

Где-то в таком ключе:
OШИБKИ   HПK  CBOБ ПEPEM AДPEC KOMAHДA    A ИCП N ГEH N ИCX METKA  OПEPAЦИЯ OПEPAHД   KOMMEHTAPИЙ
                                                 0001  0001        MACRO
                                                 0002  0002 ∧A     MET
                                                 0003  0003        GBLC  ∧B(9),∧F(9)
                                                 0004  0004        AIF   (∧F(∧A) EQ ’’).N
                                                 0005  0005 ∧B(∧A) SETC  ∧F(∧A)
                                                 0006  0006        AGO   .E
                                                 0007  0007 .N     ANOP
                                                 0008  0008 ∧B(∧A) SETC  ’M∧SNDX’
                                                 0009  0009 .E     ANOP
                                                 0010  0010 ∧B(∧A) NOP
                                                 0011  0011        MEND
                                                 0012  0012        MACRO
                                                 0013  0013        MUZA  ∧A,∧Q
                                                 0014  0014        GBLC  ∧B(9),∧F(9)
                                                 0015  0015        AIF   (∧Q NE ’B’).F
                                                 0016  0016        AIF   (∧B(∧A) NE ’’).D
                                                 0017  0017        MNOTE LABEL ∧A NOT YET DEFINED
                                                 0018  0018        AGO   .E
                                                 0019  0019 .D     UZA   ∧B(∧A)
                                                 0020  0020        AGO   .E
                                                 0021  0021 .F     AIF   (∧Q EQ ’F’).FF
                                                 0022  0022        MNOTE CLASS MUST BE B OR F
                                                 0023  0023        AGO   .E
                                                 0024  0024 .FF    AIF   (∧F(∧A) NE ’’).FF2
                                                 0025  0025 ∧F(∧A) SETC  ’M∧SNDX’
                                                 0026  0026 .FF2   UZA   ∧F(∧A)
                                                 0027  0027 .E     MEND
                                                 0028  0028 PROG   START 1
                        ‾00001                   0029  0029 1      MET
                                                 0030 +0010+M001   NOP
                        ‾00001                   0031  0030        MUZA  1,B
         001             00001 00 26 00001       0032 +0019+       UZA   M001
                        _00001                   0033  0031 2      MET
                               00 22
                                                 0034 +0010+M003   NOP
                        ‾00002                   0035  0032        MUZA  1,F
                         00002 00 26 00003       0036 +0026+       UZA   M004
                        _00002                   0037  0033 1      MET
                               00 22
                                                 0038 +0010+M004   NOP
                        ‾00003                   0039  0034        MUZA  2,B
                         00003 00 26 00002       0040 +0019+       UZA   M003
                               00 22
                                                 0041  0035        FIN
Синтаксис Макро-БЕМШ - это примерно синтаксис макроязыка ассемблера IBM/360 на начало 1970-х. Современный макроязык, в определенной степени сохраняющий преемственность, описан в https://www.ibm.com/docs/en/zos/2.1.0?topic=reference-introduction-macro-language

Profile

Сообщество любителей БЭСМ-6

December 2025

S M T W T F S
 123456
78910111213
14151617181920
21222324252627
282930 31   

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Jan. 13th, 2026 04:46 pm
Powered by Dreamwidth Studios