spamsink: (Default)
[personal profile] spamsink posting in [community profile] besm6
Как мы все знаем™ в юниксных ассемблерах существует возможность вводить локальные метки, обозначаемые цифрами, и ссылаться на ближайшую метку с данной цифрой, дополнительно указывая после цифры 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
This account has disabled anonymous posting.
If you don't have an account you can create one now.
HTML doesn't work in the subject.
More info about formatting

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. 14th, 2026 05:12 am
Powered by Dreamwidth Studios