Как принято вычислять условные выражения на БЭСМ-6 (МЭСМ-6)

24 views
Skip to first unread message

Евгений Халуев

unread,
Oct 15, 2021, 1:34:06 AM10/15/21
to БЭСМ-6
Доброго времени суток!

Пусть машина находится в режиме работы без округления (считай целочисленный режим). В памяти, по адресам M1+a, M1+b лежат два числа (но могут лежать и на стеке через M15 (M17))

Как может выглядеть программа вычисляющая строгие и не строгие неравенства чисел a и b?

Например, для программы вида (условия в операторе IF):
module ifsimple;

const
    pass = 12345;
    fail = 54321;

var t1, t2 : integer;

begin
    t1 := 5;
    t2 := 10;
    if t1 <= t2 then
        t1 := pass
    else
        t1 := fail
    end;
    halt(t1)

end ifsimple.

Я делаю игрушечный компилятор по мотивам книги Вирта "Построение компиляторов" где применяется классический подход - генерация кода на лету, а программа при определенных ограничениях может откомпилироваться за один проход компилятора.

Подобная программа транслируется в код одноадресной виртуальной машины:
TEXT:
00000: ifsimple_main ALLOC    2         ; выделение места на стеке
00001:               CLOAD    2         ; загрузка константы 5 на стек
00002:               VSTOR    -2        ; сохранение в локальную переменную t1
00003:               CLOAD    3         ; загрузка константы 10
00004:               VSTOR    -1        ; сохранение в t2
00005:               VLOAD    -2        ; загрузка знач. локальной переменной t1 на стек
00006:               VLOAD    -1        ; загрузка знач. локальной переменной t2 на стек
00007:               RELOP    <=        ; удаление со стека 2-х значений, запись на стек результата сравнения
00008:               BR_ZERO  12        ; переход если ложь
00009:               CLOAD    0         ; загрузка константы pass
00010:               VSTOR    -2        ; сохранения вершины стека в перем. t1
00011:               BR       14        ; переход на окончание оператора IF
00012:               CLOAD    1         ; загрузка fail на вершину стека
00013:               VSTOR    -2        ; сохранение вершины стека в t1
00014:               VLOAD    -2        ; загрузка аргумента на стек
00015:               SYSCALL  halt      ; вызов системной процедуры
00016:               DEALLOC  1         ; очистка места под аргумент после вызова
00017:               STOP     12345     ; останов

CONSTANT TABLE:
00000:     pass    12345
00001:     fail    54321
00002:        5        5
00003:       10       10

PROCEDURE TABLE
ifsimple_main: 0

И вот, добравшись до генерации кода целевой машины, возникает вопрос как в командах БЭСМ-6 правильно закодировать условный оператор для выражений с <, <=, ==, !=, >=, >.

Из набора команд имеем два варианта условного перехода:
UZA - переход по ω = 0
U1A - переход по ω = 1

В зависимости от типа операции флаг ω вычисляется так:
switch (ω mode) {
case additive: ω = (A[41] != 0); /* A < 0 */ break;
case multiplicative: ω = (A[48] != 1); /* abs(A) < 0.5 */ break;
case logical: ω = (A[48:1] != 0); /* A != 0 */ break;
case 0: ω = 1;
}

Получаем что для кодирования a < b:
xta a,M1
a-x b,M1
uza else_block   ; u1a для a >= b
...

Для a == b:
xta a, M1
aex b, M2
u1a else_block   ; uza для a != b
...

Как быть с нестрогим неравенством, типа a <= b ?

Leo Broukhis

unread,
Oct 15, 2021, 3:04:52 AM10/15/21
to БЭСМ-6
On Thu, Oct 14, 2021 at 10:34 PM Евгений Халуев <eugene...@gmail.com> wrote:
Как быть с нестрогим неравенством, типа a <= b ?

Вы серьёзно? Вычислить b-a; если оно больше или равно нулю, то a <= b.

Для удобства вычитания в обе стороны (если операнды сравнения - выражения) существует команда X-A.

Leo
 

Евгений Халуев

unread,
Oct 15, 2021, 3:29:03 AM10/15/21
to БЭСМ-6
Леонид, каюсь 😅😅😅 я думал меньше минуты

Действительно, если переставить местами получим:
Получаем что для кодирования b < a:
xta b,M1
a-x a,M1
uza else_block   ; u1a для b >= a что есть a <= b

пятница, 15 октября 2021 г. в 14:04:52 UTC+7, Леонид Брухис:

Leo B.

unread,
Oct 15, 2021, 2:40:13 PM10/15/21
to БЭСМ-6
Кстати говоря, Фортран-Дубна, дословно переписанный с компилятора CDC 1604, в котором были все варианты перехода по условию,  с точки зрения бэсмовского программиста порождает нечто довольно безумное.

                PROGRAM MAIN
                INTEGER I, J
                IF (I.LE.J)
       2       -            GOTO 1
       3        STOP
            1   END

компилируется в 

                   C*****HAЧAЛO  OПEPATOPA 1
 0001                          , XTA ,  I
  -                            , NTR ,  3
 0002                          , X-A ,
  -                            , A+X ,  J
 0003                          , NTR ,  18
  -   0005                     , UZA ,  *L0000
 0004 0006                     , UJ  ,  *L1
  -
 0005               *L0000  :  , BSS ,
                   C*****HAЧAЛO  OПEPATOPA 2
 0005 0007                     , UJ  ,  *1
  -
 0006               *L1     :  , BSS ,
                   C*****HAЧAЛO  OПEPATOPA 3
 0006                        13, VJM ,  STOP*
                   C*****HAЧAЛO  OПEPATOPA 4
  -
 0007               *1      :  , BSS ,
 0007                        13, VJM ,  STOP*

Фортран-ГДР гораздо лучше:

  001               PROGRAM MAIN
  002               INTEGER I, J
  003               IF (I.LE.J) GOTO 1
  004               STOP
  005           1   END

              7 , VTM , *C
C *** STATEMENT 00002   > 00000< ***
C *** STATEMENT 00003   > 00000< ***
              7 , XTA , I-*C
              7 , X-A , J-*C
                , UZA , *SL00001
C *** STATEMENT 00004   >:00002< ***
                , CALL, STOP*
           :    , BSS ,
C *** STATEMENT 00005   >:00003< ***
   *SL00001:    , CALL, STOP*

Leo

Василий Долматов

unread,
Oct 16, 2021, 2:58:15 AM10/16/21
to 'Кирилл Кобелев' via БЭСМ-6
вот вставление NTR 18 в кучу мест дубненским транслятором всегда меня озадачивало… 
интересно, чего они пытались избежать этим?

15 окт. 2021 г., в 21:40, Leo B. <leo...@gmail.com> написал(а):

--
Данное сообщение отправлено Вам, как участнику группы "БЭСМ-6":
http://groups.google.com/group/besm6/topics
---
Вы получили это сообщение, поскольку подписаны на группу "БЭСМ-6".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес besm6+un...@googlegroups.com.
Чтобы посмотреть обсуждение на веб-странице, перейдите по ссылке https://groups.google.com/d/msgid/besm6/54c080f8-3d99-4c37-9ec4-315936c7414cn%40googlegroups.com.

Leo B.

unread,
Oct 17, 2021, 2:44:00 AM10/17/21
to БЭСМ-6
On Friday, October 15, 2021 at 11:58:15 PM UTC-7 ReedCat wrote:
вот вставление NTR 18 в кучу мест дубненским транслятором всегда меня озадачивало… 
интересно, чего они пытались избежать этим?

Они этим включали нормализацию, чтобы гарантировать, что в обе ветви управление придёт в режиме плавающей точки, и, по необходимости, включали режим перехода по 41-му разряду.


Leo
Reply all
Reply to author
Forward
0 new messages