Сделай сам
Apr. 19th, 2021 03:09 pmКак мы все знаем™ в юниксных ассемблерах существует возможность вводить локальные метки, обозначаемые цифрами, и ссылаться на ближайшую метку с данной цифрой, дополнительно указывая после цифры b или f, что значит "назад" и "вперёд".
Например,
Цифры для меток можно было переиспользовать сколько угодно раз.
Таким образом можно было заботиться о придумывании гораздо меньшего количества имён для меток. Похожая по духу фича была и в DEC-овском ассемблере, а вот в IBM-овском ничего подобного не было, потому что считалось, что с помощью макросов можно сделать что угодно.
Предлагается задача: реализовать на макроассемблере IBM/360 (он же БЕМШ) локальные метки в стиле юниксных, так, чтобы можно было писать, например,
Например,
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