Недостаток стандартного массива
May. 16th, 2019 11:21 amОбнаружился недостаток стандартного массива: нет простого способа инициализировать массив данных адресами других объектов. Скажем, сделать массив указателей на строки или массив указателей на фукнции. Проблема в том, что настройка адресов выполняется только в секции команд и в секции рассылок. Секция инициализированных данных ("констант") не настраивается.
Единственный штатный способ инициализировать массив указателей это разместить его копию в сегменте команд, и сделать рассылку в секцию BSS. Но при этом расходуется лишнее место в секции команд, а его жалко.
Можно решить эту проблему, введя дополнительный формат инструкций рассылки: пересылать адрес источника, а не его содержимое. В этом случае сохраняется совместимость со стандартным массивом.
Единственный штатный способ инициализировать массив указателей это разместить его копию в сегменте команд, и сделать рассылку в секцию BSS. Но при этом расходуется лишнее место в секции команд, а его жалко.
Можно решить эту проблему, введя дополнительный формат инструкций рассылки: пересылать адрес источника, а не его содержимое. В этом случае сохраняется совместимость со стандартным массивом.
no subject
Date: 2019-05-17 01:03 am (UTC)FOO : , NAME, A : , SUBP, B : , SUBP, 0000 C : , Z00 ,A - 0001 : , Z00 ,B - , END ,Вот и проинициализировали массив С адресами A и B.
no subject
Date: 2019-05-17 01:05 am (UTC)А:,WEQ,B
Означает, что А приобретает значение содержимого младших разрядов слова по адресу B на момент загрузки. Транзитивное замыкание не делается, т. е. для гарантии правильной работы В само не должно быть WEQ.
no subject
Date: 2019-05-17 01:14 am (UTC)no subject
Date: 2019-05-17 01:16 am (UTC)ABTOKOД MADLEN (1.10.72) *FOO* : , NAME, *BAR* : , LC ,1 *BAZ* : , LC ,1 0000 , Z00 , - , Z00 ,*BAR* 0001 , Z00 , - , Z00 ,*BAZ* , END , ЧИCЛO ПEPФ. 0008 ЧИCЛO OШИБ. OПEPATOPOB 0000 *PASCAL 16.05.19 M1 PASCAL COMPILER 15.0 (15.02.82) 00001 1 0 PROGRAM MAIN(FOO,BAR,BAZ,OUTPUT);(*=S7*) 00001 2 1 VAR FOO:RECORD A, B: !INTEGER END; 00001 3 1 BAR, BAZ: INTEGER; 00007 4 2 BEGIN 00010 5 2 BAR := 12345; BAZ := 67890; 00013 6 2 WRITELN(FOO.A!, FOO.B!); 00033 7 0 END. *NO LO *EXECUTE 12345 67890no subject
Date: 2019-05-17 01:20 am (UTC)no subject
Date: 2019-05-17 01:27 am (UTC)Если дополнительным битиком удастся сохранить совместимость (в одну сторону) со стандартным массивом, то хорошо.
no subject
Date: 2019-05-17 01:28 am (UTC)no subject
Date: 2019-05-17 01:31 am (UTC)Совместимость в одну сторону будет. Можно будет линковать стандартные массивы от всех существующих трансляторов.
no subject
Date: 2019-05-17 01:33 am (UTC)ABTOKOД MADLEN (1.10.72) *SIZE* : , NAME, PROGRAM : , SUBP, JUMP : , WEQ ,PROGRAM 0000 13, Z00 , - , Z00 ,PROGRAM 0001 13, Z00 , - , Z00 ,JUMP , END , ЧИCЛO ПEPФ. 0008 ЧИCЛO OШИБ. OПEPATOPOB 0000 *PASCAL 16.05.19 M1 PASCAL COMPILER 15.0 (15.02.82) 00001 1 0 PROGRAM MAIN(SIZE,OUTPUT); 00001 2 1 VAR SIZE:RECORD A, B: INTEGER END; 00007 3 2 BEGIN 00010 4 2 WRITELN(’ PROGRAM CODE SIZE IS’, SIZE.B - SIZE.A); 00027 5 0 END. *NO LO *EXECUTE PROGRAM CODE SIZE IS 14no subject
Date: 2019-05-17 01:50 am (UTC)12, BASE, *
Date: 2019-05-17 04:30 am (UTC)Вот, оно - разделенные сегменты и базовый адрес, такие как:
12,BASE,*
Это очень часто встречается во многих программах, своего рода стиль, но он не будет работать на отдельных сегментах. Я надеюсь, что не нужно объяснять. Один из способов решить эту проблему - использовать расширение для модели памяти. например совместимая модель 32K TEXT + DATA а-ля BESM-6 и MESM-6 32K TEXT 32K DATA. Это означает, что нам нужен дополнительный бит или регистр, чтобы управлять им. Режим модели памяти может быть использован в качестве решения для защиты некоторых адресов, пользователей от spervervisor and v.s. ...
no subject
Date: 2019-05-17 04:43 am (UTC)NB: Сегментация может быть вероятной проблемой для 15-битных адресов
no subject
Date: 2019-05-17 04:58 am (UTC)Я все еще собираю сведения, один компонент отсутствует на ленте из Дубны, поэтому, чтобы восстановить все значения из некомментированного [:)] исходного кода Madlen, требуется время.
Кстати, кажется, что корни reduol и стандартного массива растут от М-220, Силин сделал то же самое для системного загрузчика М-220 до BESM-6.
no subject
Date: 2019-05-17 05:31 am (UTC)no subject
Date: 2019-05-17 06:25 am (UTC)char *strings[] = { "abra", "cada", "bra" };Стандартный массив не даёт разместить его в сегменте .data (то есть "const"). Вы предлагаете класть его в сегмент .text ("cmd"). Но сегмент команд потенциально закрыт на запись: read-only (как в юниксах) или exec-only (как на МЭСМ-6).Выход - ввести специальный вариант команды рассылки: инициализировать не содержимым ячейки-источника, а её адресом. Тогда всё получится.
no subject
Date: 2019-05-17 04:06 pm (UTC)001L ТЕSТ1 : , NАМЕ, 002L 4001 ТЕSТ2 : , SUВР, 0000 ТЕSТ1 : , ВSS , 0000 1530 00000 13, UJ , - 00000 4003 , Z00 ,ТЕSТ1 0001 00000 4004 , Z00 ,ТЕSТ2 - 00000 4006 , Z00 ,ТЕSТ1-ТЕSТ2 0002 00000 4010 , Z00 ,ТЕSТ1+ТЕSТ2 3 , ЕND , ТАБЛИЦА ОПИСАНИЙ: 4000 6445636421000000 0000401163000000 0000000041000000 4003 0000000052100002 0000000052100001 0000400200300001 4006 0000000052100005 0000400200100001 0000000052100007 4011 6445636422000000 Расшифровка: 4000 TEST1 4001 <4011> equ ext. subr. name 4002 label offset 0 4003 weq value of <4002> 4004 weq value of <4001> 4005 equ <4001> - <4002> 4006 weq value of <4005> 4007 equ <4001> + <4002> 4010 weq value of <4007> 4011 TEST2и даже можно сделать следующее:
001L ТЕSТ1 : , NАМЕ, 002L 4001 ТЕSТ2 : , SUВР, 0000 ТЕSТ1 : , ВSS , 0000 1530 00000 13, UJ , - 00000 4005 , Z00 ,ТЕSТ1 0001 00000 4006 , Z00 ,ТЕSТ2 - 00000 4010 , Z00 ,ТЕSТ1-ТЕSТ2 0002 00000 4012 , Z00 ,ТЕSТ1+ТЕSТ2 4003Х МL : , Р*Р ,ТЕSТ1, ТЕSТ2 4004Х DV : , Р/Р ,ТЕSТ1, ТЕSТ2 - 00000 4013 , Z00 ,DV 0003 00000 4014 , Z00 ,МL - 00000 4016 , Z00 ,МL - ТЕSТ2 0004 00000 4020 , Z00 ,МL - DV 5 , ЕND , ТАБЛИЦА ОПИСАНИЙ: 4000 6445636421000000 0000402163000000 0000000041000000 4003 0000400210100001 0000400210300001 0000000052100002 4006 0000000052100001 0000400200300001 0000000052100007 4011 0000400200100001 0000000052100011 0000000052100004 4014 0000000052100003 0000400300300001 0000000052100015 4017 0000400300300004 0000000052100017 6445636422000000 +++ СТРУКТУРА ПРОГРАММЫ: +++++++++++++++++++++++++ ...Существует несколько дублированных типов описания (1,2,3,7), которые, возможно, были запланированы или продуманы для разной логики для данных (data) и тext, но на данный момент они обрабатываются одинаково.
no subject
Date: 2019-05-17 07:35 pm (UTC)Тип T=521, похоже, ровно то что нужно. Поле A содержит номер другого символа, _адрес_ которого подставляется в младшие биты перемещаемого слова. Если задействовать такой тип символа как источник инструкции ,SET, - можно будет инициализировать массивы секции данных адресами других данных или функций.
no subject
Date: 2019-05-17 08:07 pm (UTC)001 - сложение двух символов
003 - вычитание двух символов
101 - умножение двух символов
103 - деление двух символов
Силин был силён! :)
no subject
Date: 2019-05-17 08:23 pm (UTC)Интересно, как там всё было устроено.
no subject
Date: 2019-05-17 08:27 pm (UTC)no subject
Date: 2019-05-18 02:36 pm (UTC)