OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Понедельник, 25 Март, 2019 06:25

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 23 ]  На страницу 1, 2  След.
Автор Сообщение
СообщениеДобавлено: Вторник, 19 Апрель, 2011 17:05 
Модератор
Аватара пользователя

Зарегистрирован: Среда, 16 Ноябрь, 2005 00:53
Сообщения: 4488
Откуда: Россия, Орёл
У Вирта (заметка про SET --- http://oberoncore.ru/library/wirth_sets) используется только логический сдвиг влево. В ARM он даёт нуль, если величина сдвига >= размера регистра N. Теоретически всё выходит гладко. Итого {n} = {} для n >= N. Логично, типа не влезает. Проверка на включение n IN x даст ложь для n >= N.

В интеле (ББ) сдвиги делаются по MOD N. Т.е. сдвиг на 33 = сдвиг на 1. Оминк для вычисления {n} вообще использует циклический (?) сдвиг вместо логического. Получаем жопу вида {n}={1} при n = 33.
Проверка принадлежности n IN x делается спец. инструкцией BT (INSTRUCTION SET REFERENCE, A-M, с. 104/ http://www.intel.com/products/processor/manuals/). Если цель проверки — регистр (n IN {n}), то номер бита берётся по MOD N. Получаем истину n IN {n}, n = 33, {n}={1}. Если память (n IN x[0]) — то номер бита берётся по MOD N, а адрес слова — базовый + n DIV N. Здесь получается некорректное чтение памяти. Результат зависит от того, что будет в следующих словах.
Код:
MODULE PrivSet;

   IMPORT Log;

   PROCEDURE Test*;
      VAR   x: ARRAY 3 OF SET; n: INTEGER;
   BEGIN
      n := 33;
      Log.Set({n}); Log.Ln;
      Log.Bool(n IN {n}); Log.Ln;
      Log.Bool(n IN {1}); Log.Ln;
      x[0] := {n};
      Log.Set(x[0]); Log.Ln;
      x[1] := {};
      Log.Bool(n IN x[0]); Log.Ln;
      x[1] := {1};
      Log.Bool(n IN x[0]); Log.Ln;
      n := 65;
      x[2] := {};
      Log.Bool(n IN x[0]); Log.Ln;
      x[2] := {1};
      Log.Bool(n IN x[0]); Log.Ln;
   END Test;
   
END PrivSet.
Код:
 {1}
 $TRUE
 $TRUE
 {1}
 $FALSE
 $TRUE
 $FALSE
 $TRUE


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 16 Ноябрь, 2016 03:09 
Модератор
Аватара пользователя

Зарегистрирован: Среда, 16 Ноябрь, 2005 00:53
Сообщения: 4488
Откуда: Россия, Орёл
Текущая реализация компилятора:
VAR n: INTEGER;
n := 33;
n IN {1} = TRUE or range error if enabled

VAR s: ARRAY 2 OF SET;
s[0] := {}; s[1] := {1};
n IN s[0] = TRUE (* обращение идёт к s[1] *) or range error if enabled

Хотелось бы исправить прежде всего реализацию (n IN s) до математического поведения при отключённых проверах границ, т.е.
n IN s = FALSE, ~(0 <= n <= 31)
чтобы иметь возможность писать чисто
x IN {3, 5, 7}
(см. http://oberoncore.ru/library/wirth_sets) вместо
(0 <= x) & (x <= 31) & (x IN {3, 5, 7})
а заодно исключить некорректное обращение к памяти (n IN s[0]).

Второй момент --- вычисление SET-значений, но он менее критичен.

У меня есть варианты решения, но недостаточно знаний, чтобы выразить его в терминах кодогенерации компилятора ББ. Надо разбираться, а это не быстро. Товарищи, кто уже в теме, поглядите. Сложно ли это внедрить?

n IN s = (n <= 31) * (n MOD 32 IN s) s IS reg
MOV ECX, n
CMP ECX, 31
SETBE AL
(*MOV EDX, s *)
(*AND ECX, 31 *)
BT EDX, ECX (* CF = ECX MOD 32 IN EDX *)
SETB AH
AND AL, AH
MOVB result, AL

n IN s = (n <= 31) * (n MOD 32 IN s) s IS mem
MOV ECX, n
CMP ECX, 31
SETBE AL
AND ECX, 31
BT s, ECX
SETB AH
AND AL, AH
MOVB result, AL

Код:
StdCoder.Decode ..,, ..zm0...3Qw7uP5PRPPNR9Rbf9b8R79FTvMf1GomCrlAy2xhX,Cb2x
 hXhC6FU1xhiZiVBhihgmRiioedhgrZcZRiXFfaqmSrtuGfa4700zdGrr8rmCLLCJuyKtYcZRiX
 7.2.s,6FN,,k,5TWyql.bnayKmKKqGomC5XzET1.PuP.MHT9N9ntumaU2,CJuyKtQC98P9PP7O
 NbXmb.2.Imfk2E3j0,6.,U08J99SdfJHPNjvQCJuGKfaqmY6MwdONl1QCh0708T,U..w.YafU.
 2U18J99SqorGqmQCbWBxhYFWUl1UnNHEWUmr.6.wqdk5kLb0,6.,U,Yo9U00.bnUGLu8ro8quG
 rmCLWKqtE0E.ELU.EBU.U,2.I3l6w1.0E65.2.c8fP3d8mBE,5TeEdKLqKKtCLLCJuIepZBGom
 Crl0ks,ktuGdKLqKa2V.Iy1U.2.q9S.C80E.QE.sQRtIQeoBjghg2hgn7.X5.u0n9PU.Iy5.,.
 60cKE.cU.UiAco,.2.7.,..Y22U,U.2.2YXK9FR81EnXE,wnjl.k.E.0.C.2.grPL.9AS3E,5T
 WKKvCorqqq4KrGqm8rtumdYgK,6.XDF9fR.ELO3U.Iy1.,UIU.U4.,k8EAk.8Mtr.0E.6C6.c4
 E.yD2.eG..2UE0u.AU.U.Ux0EtD,2.0G.6.c,E.g0o26.Mj..2.000.O.2.f.1,,6.Mj..2.00
 0.O.2.f.d.,.q9..,UUU.U4.,k8.2.Mj..2.000.O.2.f.E.Ux0.E.666.c,E.g0g02U.UQQd0
 s4Rd.8ssDJuGKaaKriqtuGe4KtSqmGLWKqtC4U.kAU.E6E.M.F.5uPR9R99Sd9.3cUZT1E.c9E
 .c4E.szE.e0c.6YU.Ume.iFL..YddphfZcZRC.0.J0,6.242.4EIkdGLmm2CbH3hjxiIBgmxAW
 mHKnWGHOOHOOHWCIW0nUWnQ4HWSmIIU2U0.Z3Umr06.I26.2,2..3M.c.,.Z3.U.EZU.EME.M.
 kd....kW8HO0nQ0HMKoVSmIIUF.EN,.6.I26.2,2..3M.E.EN,.6.A52U.EME.M.kd....Uoga
 kIapwaq2abA35cUZT1E.sAE.c4E.szE.eWwpr,c.6YU76.8.0EN,.6.I26.2,2..3M.E.EN,.6
 .I76.242.4.Q8....kV0HWOnQanNSmIQUAU0.Z3.U.EFU.E2E..IU,U.2.Y1Q1k8U.EFU.E2E.
 .M.,.,.ZJ,.o06.YB2.I86.4EZko8nMCrwCrV4Kqmqtumb0rmuKISGoGLu0LRymLOqr8ruqKLy
 KlKKtyKrCqr8rmuGtKrLOroKaoxhkBhXpZk3hkxbahblQaloYohbnYalAabA33MBE.EN,.2U.E
 9U.E2E..676,3gwP.0.N,,.p.0..JFAE.6.VQ.k,UCU3Ikmj,6.oN2U.EBU.U,2.I3.0ES9.o.
 cU,6.4E3E.y3,M.FH.2UbBU.M,B.G74E3Ur7.2B2UtV,.,Mt1.xzzzzzS40EzVQU3o.6g3U3o.
 MWM.1.,6AM.U0G.4EoE.4o.M.1U.6AM.1.W20.Y1Q1k8U.kNU.kAU.M.X.fNFd7B6FMEE.Kk6E
 .0.m,..,UOD.6.W.0..36.gU56.g5czEAE.uDQ0.A2.212Uy1h,,.Q5.I6.o..Q5.2C2Uy1tF.
 2Uy1L..X.9.o2czEL.E5.ER.k5.kD.k5.kD.k5.E,,k7.E8E.uDw..Q1.Q,.o0.Y22Uy1f2,.Q
 0...h..l.,czk3.E9.EGE.uDQ0.Y3gU0.16.czkR3..h.0.m,..,Un.,UN.,k.4,K1kW81nFM6
 .9M26.,.t..U.E9U.E2E..M.,U4Ikmj,2U.kNU.EBU.U,.JFyA.,U.2GkjD.B.SyG8Ua5V0cU.
 ,UW.,UN.,k.4,K1Uog4Z,0k18Mtr.0E.sA2.,UO.,.16.c8.2Uw0aU.c,,.D5.E.0.D,0.F.,.
 U,U4gs0E1Ub1.6.,Un.,UN.,k.4,K1.506.D61c,,.D5.E.0..2,2..BMm2.pzzzzzi,yT,WGJ
 qE,GomOrV6QH9P9fQRtETPPEeWqoCLEGomOrjGqmObERco2bqQZBIU2hAy4cQ.Y8.UE,Pc.7W2
 hgXxhYhgmpZ2hgXVUYcZpC.k48EWKaT,UiYeZRioBaBIU2,..8n48EW...bN136F..UogVBIU0
 Ad,RamIUBIU2lV2eigcs3iZJinRidxhiJUBI.EVumYuK,qE,.50aIrk48EoGLu0LR...IC....
 Aa0gVeAZBoVBxd2heAhcUYcZ,.in4qk2aoa0pb8Je0Gayqnin4qk20JdyoVKIWKJdKIEGpmCLu
 4HJin4ak2OpU8p2uKR0mYuIeKoXKIdiHECLR0mdKIein4aEVKoXaIbqk2aEIemt0GRqHEirNCn
 yin2WGJ0mlyqqUUYidhhZ3YmBgixgZ3YZJimxhm3YeAZUIZdgV7AVi3YugbUQanQbBAV7QiUIb
 xsSRPTrN0FVmhiiZidhhZ,.MOB969fP1fMNPN796JN8P68JN1,76,76hOEZ86RfC,NG.gZlIaB
 2YU.Qiu2266PNAhN1BeAV7AV7AX7Ap76,76,76PuHh86,760mWCIgmmhKIV0JKqmM8niak2WHV
 GHWOIOqEX8HMUnIbU2YU665OHVWUkWkN4n2aEQCHXanMOo4OIN.hdC,76,FEeIVKIE0GE2YYoc
 m2akU,BV7waq2amgV4J4EQeHE00,7JZOEV86,76On2aEQGoWOn4O2kUeHE0GE2YB,2Y3BcMZZl
 AV7Ics2al2ak2ak24PcFZ,4HXeHE00,dIT8H,76,76K2CIaak2GoNCIMqEX81Ial.0ma.0mhKI
 VUqgfggc,3f7AVsAboga43aBgVn3Yu.qkt0mS0mM0mdWIa0GrmGEuKEmnS0mN4n4CLE6AN76x9
 8R96t,am4CLE68R96t,2Ye2YcAaUQ8M8PM1PuHhO09uEl89,dPP6KTeIHMF18KN769OEqkVqIc
 akWCIgsAXN1bOFdeE9O018HPcIT8HHMF18KQcAhVBxdKtQN769OEIZdgV76HTvNRtI99RFtQHt
 C,7HTvNR7HRvCH68JlxCnN0mayIW0mN8ny0mS0mx4ny0mkCLE8rmCrumKu0moOKEGqoCrk8KqK
 4M09eH786dmtsCPM1H.506JcAJtCPM0O3YZUghu2Y7p7.bfCUB...qmNmGEGnNqrRa.C4aKq..
 .I3JN8Pk2u4gZnQbUghUIbx2YoQavgV7sQkxuKLumqqrRaEIcQ...aKngA.68.h0R1.g3ZN1.g
 hu22.EPqEE00kt.0Wm2aBocm.dNFp76,VUg7UUgc1lh.8ni6C30.galIbU220mVq20090b,C1.
 EOeHE00,dG662YY.6CHM0jdB.EPeHEEEG366O1..ldC,,,NH.,NF1GKqmMak28Y4pc4pc4VBoc
 m.GIR0GE66b8GNGE0GEg6QcA,98APcFZ,ocu222YB,2Y3R6i3EPqp2aU0VkgV4,OHNeHE00,tE
 EEMFsAkN..KHR0GE66J0667,kQak2SXk.UrIbU220Ge.,FP..MCp76,VUg7UUgc23fggZmAV7I
 c,pc3pc4pc4p6P.kWeHE00,tIUUMFsEN0IaBocm.j7Ap76,VUodDZeU2YU229W7AV4xa2JaBo6
 UmIbU220mUuIW0GE229OEgc2398nNCINqEX816Bp76,VUg7UUQ9EN0nimmW4Y7.KoVqk4CLEeX
 U.M1b96vlxqLK0GzW0MPH76TeI,78P96t76VN8,tHZWnAaUYbUohdsQ,NDgd,3fcohg2YkAZio
 ZBBdC3ZhZZUQalAZxZZU2Zi32Ua2Yy3ZcghUEM22.oBHN1HsQ,ND2aioZnAaxZZU..WGr0WU24
 OGEQ4MPHN1H.Uhhjg22MD.u4,,MPgbUQ4qk2.RXnA4.vlq.V76tND,dPH76B76C1..gB.gBEMU
 i,q4Q4oYUiVeA3Y7Q8.Ea.iLEiry0mkC5.6NAA.aUidCYav2Yh32Q4EakdkxuKLkIin2W0qLEO
 GE1GJa090dmtsCPM1.UIVnIZvgV7cJER.UWJbUIcDxdAhc,pdvgV7I6.R1.8KEenSohUAdC3Yv
 phUgdDZ6sCP68JN1EfErUI,g3ZN100EleHE.66PlNqEX8HMEV4HR000ma.0mWC2r0Aamg9WHVE
 O.6Bp766610,FEg6Q4HUngclAa4h,.jdC,,,NH.,NF1GK4124EMg,U0Rcu2YUEE8ZA760W3V1Z
 7sE.MFp7666P06698FmmhK2.Icpga4ZaBo6kV4HR0GE6638J,76,76gc,lWM00HX4oNGIMqEX.
 GHR000mdKIe8IE0GEAcABV724ndA58APcF.jdC,762YBFV0GE0WP,QaRZZ,Zd76Cl7BfdFbVi3
 Y7pdUQiUgbU23.00uaBx766HeHAZ7QCHuI,dQ9vNPMHTeJK20GrQcB38UnM1kWUcIZBxdKB,78
 KN76b96JN8P684IbGo2KoV.,d8HFVGp2KIWW39uEaEIeGECIX0mS0mWCIg0mayIW.gc23fUIZd
 sI9W7Ac6hV,pd2BV,Zdg2Y,3dBgdDdEHcQ9vQfXg2Y,ZdBIZdk2m28oryKqWGlamR0GaEa.GJd
 KpW0GJaW7g6Y8sCPM1kV.UoIZvgV7AVK,Ee.CLRAcGJe,BfUYaUwd43YHh6rFle1.qU0,sQr8A
 v86pNDirMQbUQiPBaR3Yu.UmgfUIbx.kNqJEenS.PM0u4Q4ElUiVUQiP3aRR5cM,dCvFICnN0m
 a.H76HeH,VnQaUYc7peUQamgfUgbUA4HeHMAIZd68q.O3u4Y8UhcAP.,dJsQ...PFQqEE0GE.3
 1.0WmAbBocm24ockIbU220maoeUUUg6Qf3FKcAvWs6BfdFdN1.CHR0GE66500090bNAsAB8CXd
 FPcF.hdC,,,dG662YY.MEHM0j,.2bu2YUEEG366O1..1eC,,,dE00,VP,8HQqJKKYMB,VlUYap
 gcogV4J4kWeHEEEC3386MEaUkMC.MAVNAp76,VUg78IEkh.animmUm2l,9uAPM1R1,FE.t,.g7
 EEUdEEkqKqqqkayY7sEcP.kNg,MFkUu290EVGZnZZUgc1N1bOFdm2.A66Gq23O0.6HP.a.I6.U
 A,Y8c8A,R1,tAdtCPk284oBkh01ElUc6B,NHT8FM8.b7B,7FHeJ.8HEaIbkM.Y7I6.UAN0Fd8,
 dF18HbOF,d8HV3,kRqk4KIbGY2hgqlm.oZBoV0Ad,FEaKrCLu8ruCKuaqruqt8k4qkdWIaymd4
 Idqk4yIsKKt4Kuaqruq4aIX0GPGnK8ooGLEqorGaUAgiZgUginBhixgUIe33fiweBAVI3d3pdB
 A,5vPffPdPH1uIL86VQc,tAB8GrN1HMFNuI9O1HM051.MAB8GrN1BOGP6R9PPVvETOJR8J,7Y1
 B6FtETOJMERWXxhppBkIin4Grmqa2hcHZeU2mV8F9uIin4SJYaIaKIEWGuKqq0rV.,fc,7AHN1
 H6FTO1HM0HeF,NOR1.,NOb96bOEN86TfQ,tIF8HPM0HM0d8GU7AV1pcU2mV4YBRe03Z2hcHN8r
 N1Hk2KIa66Fd8,NGRvQd1.Ed0mr8LECZG3YeAZBM0HM050YdHJccY6.OoYin4MG...m2EaUI,M
 07OFb8J,,70SFF1GNin4ak2akWk4k2a2..UGhV7A,HEe.A,G22G.T76ZtC,78J76bOODfP99N,
 7NHfRH9N999,dQTPRR9NHfPD96dvPjPMZ9N,dP9vN19RHfR996HfPBPORPOdPS,d8H,aU3VUU7
 ,.U6J8.HU2,V2kL66r76Fd8KJrCro..,d8H,aEX.B0YiZhB.VYohgh,s2,B6XtCPM0T8FrN198
 HH8GjuCPc1ZuHNu9ZuHZO1P68J76ZuHNmkuKmIeDJeUAhi,Un3YeA3bOGpOF,7Y1B6T8Q9fQuK
 mCpoermin4CoUCpW0GIGqmGrm8rqaKrKKECqrK5H76TeFPM0bOGp02buAVohgh,6Y23U,Vloc6
 BZUgdDZ6ltC,78gdVRif3YXxhpFE8qmOqr8rm0may2JV7Qe7,AaqIb7YiZ,E678.10.MAhtCPM
 0bOG.bdApN0d1.VYc.A6.UnsCPM0.oaoM0d1.VYc.A6Qa43dd22cBdtCPMFbOE5uCPM1Fd8Udp
 hn,wB,tPVPNZHuUeA3HeF,78dPN.obU2ad2YcI3VeQOrmuKuCLEKLsGqkGrmCLEGrr0mVOIEem
 IAVL3d7,.EkUBM07uHM0d1OYEma.A3A,7OF2YEGIGoWC3j.H76L76dPNP1rN1HM0G5w76YYC.Q
 0.T8FA,a2AV1p66H.a0aIXQcD,v76XN1HM0d0,tHB86VYB,EEWpb8JECIXU3tIwd43YdRCffP7
 PNBPORPN7vCPEXa2BOGrl4W0I8..T1.JV7FuKqqsHETEEUm,0mu0Lm.d1I3a.m2.UU,PU2x7A,
 EX0G67HsIZuEHtCPM0HEWK2,7Y23kLM8,VcYiZ,SFF1WUQe7Jf3N8rN1HUo,T007d1.b.kbU3N
 G.UB,M8rV7lV.v,Y8.V2.22MHbeE,d23B6X787OFbWvk2KYH,a4.R1o6o6oV0ZeBoYUiVL3hZp
 hUAgXRgZRinBhixA1963POd96HfP,NP9PPTfQn99,7RFPN,7QZvP5PNbnr8LEqqkaLE4qlC40G
 O0GlaLuKqtQioBgmZidphbdNZvPP96d9O9P1PPNPvP2YVZgYJiZRin3Yaxhm3YV3YnM93POd96
 T9Q9Xi76bPOpPNN76fvQElaLEGLo2YaxhgZhjxidphbdQ99P19RHvPCLoaKsen4akWOKnKqlGr
 oOrmAcYZgm,L76F7BSFF3Z0Bhoxdapgnhgo3Y2B7M8HN1Rc.7ONhXEp3kt.aEc8Z1VGlWWLs8r
 mCbdxBFdJ1eIWLR0GWoi17JRdHT9N9P8rN1HEfkwmGE0LtKKK0Gq4qtGLR0GW.Uv2YjJgeJbUY
 cZ,yIleqmCKuiXmhAUu2Y0BfIhcvgV7I666bOOP9QNPN98SVfQC56SHtCPM0HMG2ZZBig3Ywg5
 bPSaGEO0bPSP96tNDSqm4rI0GeWoWuo4EtKKq442Yug5bPSiHEGomkdumXKKuWmtabdQbUQedh
 B..arIin4M0VfQ996pNDuoYmoR0Gq4qt2YugbU.PM0HkYEwuGuaLsumlyqq0LEaIb0mx4It8rk
 aLK0GWaLr4It8ryaGEO0l1IcVRiZZet3iiogjJih3Y7p759O1fQbONdP8,7JF0M07ONhX0tIdf
 Q7ONZPNB98lP8PM0akWuYvg,A7AjiYit3C51kx...ADEV.oA.51..aEW..kwam4ak2g6.70sEF
 PN5vO3ORBfN8rouqnWGwmGEuoYmIK0GbUkJCNFqkIin4....Ajg2YCB7o76Q...sHV98ZPNN1Y
 ZU2jg2YtBZv.HWkJiZ3YX2YCBdA3YI3d3767ONU1xhiRioJC2ZCRgjhBN76VXg6SHtC,7QZPNR
 7RnHEenS2jiYCiHEWLEenS2imhgUgcCZcBAV7gcANGB86bPSP96vlouKEGJYKYBU2,b0Ud..sQ
 .iHEG2I6HGIWLK00PU3,EEkt0GeWoW.UH,kIg,A7C5,,7PNR9RGJY.aksKrkmqoG4Wmr8KpamR
 qk2M0HWjJgepZhxhYlS0GeabUYe6FE.3GeaLsGpmCbc2jg2YjJgeZZUoc,Z7am4aU7AV3lW0mm
 8LtWmO8nIqk2aU7gcCN1A,N0koGqmM8PM0cHkWU3p7,NFl9Q.in4uE,G2kYI.HEd.MGRf8FdJ1
 Ws,6Ju2MSp7670.a0o8ogu2YH3dDJeIBdCZev2YfJbUAdCZe3,PEVUUogUIbx6SELUvU7FIWbX
 ZhVRin3Yx2YCZit3iZBZUw7WGw.UkJijRgd2YDJ8abXZhV,YC...056JF09fQZnM8HPam4aU3Z
 7HWcogUAdC3YdphoReZZidc7Euc9EEqHECpmG5d0P.HWa3Yx2Y7phopao2YIVUQcjdR9fQd98l
 99GomO5AhitAZ7Rn9QH769eHi1a.WLLC4.5vPRvQ0GeW2P.HsO,dCv76QgjphqBggpZdFv4Kqi
 n4a.HMG2Zf3Yw2Ykkb83LHT0GWK4qILqokWrdK4UUgAIakIadgV7M0HMFUtpZX,.C5Usp3oC.2
 Yug53uPT9PduPHePd98L96HeH,NSRlr.bXqBggBZv2YspZjJge3Yug5RWBAV7AV7g6KY0BhiZg
 CxhYhgn3ZCZgj3ig2Y2,dGly4dPSV99,7SNlwQ5lntKLlCKq0GRqXdphBAV7M09eHqU7Ea....
 ......u2gcAVZVtIadg,KIb2YvgV76SR7RnHEe17ONh1.gV7g6AdiRbBoV0.C2A7..c8,78hOE
 ZGwmGEIbU.mIOWHPuWohAHtCI6odBkYMSOqr85UUYe6V13hZRAF7SNFMmGECXdMFR0Y6.wcZph
 0Bhoxdk3Z0Zeg2Yslwa0BeQ9PNF7SHtCO2AjdQbBM0bPNdvE588l99mqtCLK0GX42mGEOoUkIi
 HEWGJQgVJimBjUQiZZiUIZdkW.IY2iW2iZ24YlQaiAaloZm2aloaUAasIbmYauAap2Yf24V7AP
 cUXDJ99SCoruKu8rrmKqKKtCLLC358RZ9P7ONbvM,MwdGw..umVyKrG5EWE.QcjlkaKrICUm,.
 .Unp3.6F6.ZD,2U.UIE.0.a.0E..k.8cCU.2.4K.s,MK6.,k,9T66.,.E2kT2.0.3gwZ.0..Y2
 2U,2.2.2YXG.0U.ow6I.zY.AU.k.E.0.3o42.0..I10U.U,.JFA.0E65.2..N6yY,YZPS9L6y0
 I,5TWy4PPNQiiQcj,.kAU...F.,.aU.EAjot2YbQI,AzJE.nT32XD3h.2oe2n..8U0...
 --- end of encoding ---


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 16 Ноябрь, 2016 12:44 

Зарегистрирован: Понедельник, 28 Ноябрь, 2005 10:28
Сообщения: 1173
Евгений Темиргалеев писал(а):
Хотелось бы исправить прежде всего реализацию (n IN s) до математического поведения при отключённых проверах границ

А при включенных?
В определении языка указано что n должно быть между 0 и MAX(SET) и реализация исходит из этого. Иначе получаются забавные казусы:
Код:
x := 7;
y := 31;
z := 32;
s := {x..z};
p := {x..y}; INCL(p, z);

Попробуйте сходу угадать, чему равны s и p.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 16 Ноябрь, 2016 15:38 
Модератор
Аватара пользователя

Зарегистрирован: Среда, 16 Ноябрь, 2005 00:53
Сообщения: 4488
Откуда: Россия, Орёл
1) При включённых до обработки результата дело не дойдёт.
2) У Вирта на армовском компиляторе n IN {1}, n = 33 должно дать корректное математическое значение, в арме сдвиги по-другому работают.

>В определении языка указано что n должно быть между 0 и MAX(SET) и реализация исходит из этого. Иначе получаются забавные казусы.
3) Так про эти казусы я выше и написал. Они весьма неприятные. Поэтому нужно либо иметь математически корректную реализацию --- чтобы результат был ожидаемый, либо включённые по-умолчанию проверки. А так можно и выход за пределы массивов не проверять и получать очень забавные казусы. Но это ведь не наш метод.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 16 Ноябрь, 2016 15:43 
Модератор
Аватара пользователя

Зарегистрирован: Среда, 16 Ноябрь, 2005 00:53
Сообщения: 4488
Откуда: Россия, Орёл
Trurl писал(а):
Код:
x := 7;
y := 31;
z := 32;
s := {x..z};
p := {x..y}; INCL(p, z);

Попробуйте сходу угадать, чему равны s и p.
Поскольку {0..31} --- универсальное по определению языка, то s должно быть {7..31}, p --- {7..31}. А будет, если правильно угадал, s = {}, p = {0, 7..31}.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 16 Ноябрь, 2016 16:00 
Аватара пользователя

Зарегистрирован: Четверг, 08 Октябрь, 2009 15:00
Сообщения: 2257
Было хорошее обсуждение этой проблемы:
http://forum.blackboxframework.org/view ... f=58&t=252

Дело в производительности, операции с SET должны быть производительными, они часто используются на системном уровне.

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


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 16 Ноябрь, 2016 16:05 
Модератор
Аватара пользователя

Зарегистрирован: Среда, 16 Ноябрь, 2005 00:53
Сообщения: 4488
Откуда: Россия, Орёл
Иван, операции с массивами тоже должны быть производительными, они тоже часто используются на системном уровне.

И, раз уж речь зашла про скорость, нужно показывать конкретные места, в которых просадка по скорости создаёт реальные проблемы. Иначе получается преждевременная (необоснованная) оптимизация.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 16 Ноябрь, 2016 18:36 

Зарегистрирован: Понедельник, 28 Ноябрь, 2005 10:28
Сообщения: 1173
Ну это ерунда выйдет: программа которая правильно работает при выключенных проверках и трапает при включенных.

А предложенное решение не совсем подходит. Оно будет работать в присваиваниях, но не будет в условиях.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 16 Ноябрь, 2016 18:42 
Модератор
Аватара пользователя

Зарегистрирован: Среда, 16 Ноябрь, 2005 00:53
Сообщения: 4488
Откуда: Россия, Орёл
Тема всплыла не просто так...

Сейчас искал причину... пока не понял, что ситуация невозможна, и тогда вспомнил про IN.
Код:
   CONST plus = 6; minus = 7; or = 8;
...
      WHILE c.sym IN {plus, minus, or} DO
         CASE c.sym OF <<<<<<<<< TRAP: invalid case
         | plus:
         | minus:
         | or:
         END;
         ...


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 16 Ноябрь, 2016 18:52 
Модератор
Аватара пользователя

Зарегистрирован: Среда, 16 Ноябрь, 2005 00:53
Сообщения: 4488
Откуда: Россия, Орёл
Trurl писал(а):
А предложенное решение не совсем подходит. Оно будет работать в присваиваниях, но не будет в условиях.
"Условие" это разве не логическая величина (n IN s) в AL и во флагах после AND AL, AH? Она вычислена неправильно?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 16 Ноябрь, 2016 19:45 
Модератор
Аватара пользователя

Зарегистрирован: Среда, 16 Ноябрь, 2005 00:53
Сообщения: 4488
Откуда: Россия, Орёл
Trurl писал(а):
Ну это ерунда выйдет: программа которая правильно работает при выключенных проверках и трапает при включенных.
Да, ерунда. Но лучшая, чем когда программа неправильно работает при выключённых проверках. Включил сейчас "все проверки" и полезло в других местах, где CASEв рядом нет...

Надо либо проверки на SET делать включёнными по-умолчанию, как для индексов. Либо приводить вычисления к математически корректным. Лично мне последний вариант ближе.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 16 Ноябрь, 2016 19:54 
Модератор
Аватара пользователя

Зарегистрирован: Среда, 16 Ноябрь, 2005 00:53
Сообщения: 4488
Откуда: Россия, Орёл
С точки зрения собственной производительности заменил пока (x IN y) на In(x, y)
Код:
   PROCEDURE In (x: INTEGER; y: SET): BOOLEAN;
   BEGIN
      RETURN (MIN(SET) <= x) & (x <= MAX(SET)) & (x IN y)
   END In;


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 16 Ноябрь, 2016 21:05 

Зарегистрирован: Понедельник, 28 Ноябрь, 2005 10:28
Сообщения: 1173
Евгений Темиргалеев писал(а):
"Условие" это разве не логическая величина (n IN s) в AL и во флагах после AND AL, AH? Она вычислена неправильно?

Да, я упустил, что флаги после AND AL, AH остаются.
Но можно и проще
Код:
TEST reg, FFFFFFE0 ; reg<32 <=> ZF=0
BT set, reg ;  reg IN set <=> CF=1 & ZF=0
CMC  ;  reg IN set <=> CF=0 & ZF=0

А для CF=0 & ZF=0 есть код условия.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 16 Ноябрь, 2016 21:26 

Зарегистрирован: Понедельник, 28 Ноябрь, 2005 10:28
Сообщения: 1173
вот примерно
Код:
DevCPC486:
   PROCEDURE In* (VAR x, y: DevCPL486.Item);
   VAR  mask: DevCPL486.Item;
   BEGIN
      IF y.form = Set THEN Check(x, 0, 31) END;
      
      DevCPL486.MakeConst(mask, 0FFFFFFE0H, Int32);
      DevCPL486.GenTest(x, mask );
      DevCPL486.GenBitOp(BT, x, y);
      DevCPE.GenByte(0F5H);  (* CMC *)
      Free(x); Free(y);
      setCC(x, gtr, FALSE, FALSE);
   END In;


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 16 Ноябрь, 2016 22:01 
Модератор
Аватара пользователя

Зарегистрирован: Среда, 16 Ноябрь, 2005 00:53
Сообщения: 4488
Откуда: Россия, Орёл
Trurl писал(а):
Но можно и проще
Код:
TEST reg, FFFFFFE0 ; reg<32 <=> ZF=0
BT set, reg ;  reg IN set <=> CF=1 & ZF=0
CMC  ;  reg IN set <=> CF=0 & ZF=0

А для CF=0 & ZF=0 есть код условия.
А этот вариант учитывает, что если set --- память, то reg >= 32 приводит к чтению в следующих словах памяти?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 16 Ноябрь, 2016 23:01 

Зарегистрирован: Понедельник, 28 Ноябрь, 2005 10:28
Сообщения: 1173
Зачем? Чтение же, не запись.

Или Вы хотите полностью легализовать IN с любыми целыми?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Четверг, 17 Ноябрь, 2016 04:25 

Зарегистрирован: Четверг, 12 Июнь, 2008 17:30
Сообщения: 35
Hi Евгений Темиргалеев,

first I agree with you the "k IN s" should return false when out of range [0,31].
I had done a patch for this issue, but after a year and a half, after you remind me, rechecking
the code again, I find it had a bug. the new fixup have done.
(ps; some proc's and var's name maybe changed in my code)
DevCPV486.Condition
Код:
      | in: DualExp(n.left, n.right, x, y, {}, {}, {short, mem, stk,AX}, {con, stk});
            DevCPC486.In(x, y,TRUE); (* check=TRUE *)
         | bit: Check(n.left, ux, sx);
            Expr(n.right, x, {}, ux + {short});
            Mem(n.left, y, DevCPT.notyp, {}, {});
            DevCPC486.Load(x, {}, {short});
            DevCPC486.In(x, y,FALSE); (* check=FALSE*)
         | queryfn:


DevCP486.In
Код:
   PROCEDURE In* (VAR x, y: DevCPL486.Item;check:BOOLEAN);  (* add "check" parameter *)
   BEGIN
      IF y.form = Set THEN CheckRange(x, 0, 31) END;
      DevCPL486.GenBitOp(BT, x, y,check); Free(x); Free(y);
      SetCC(x, lss, FALSE, FALSE); (* carry set *) 
   END In;


DevCPL486.GenBitOp, main code is here:
Код:
   PROCEDURE GenBitOp* (op: INTEGER; VAR num, dst: Item;check:BOOLEAN); (*add check *)
      VAR  L1:Label;c:Item; (* add vars*)
   BEGIN
      IF num.mode = Con THEN
         GenByte(0FH);
         ASSERT(num.obj = NIL);
         GenByte(0BAH); GenCExt(op, dst); GenByte(num.offset)
      ELSE
         ASSERT((num.mode = Reg) & (num.form = Int32));
         IF check THEN (*add this block*)
            L1:=NewLbl;
            MakeConst(c, 32, num.form); GenComp(c, num);
            GenJump(ccAE,L1,TRUE);
         END;
         GenByte(0FH);
         GenByte(83H + op); GenDExt(num, dst);
         IF check THEN SetLabel(L1);END; (*add this line*)
      END;
      IF (dst.mode # Reg) OR (dst.reg = AX) THEN a1.mode := 0; a2.mode := 0 END
   END GenBitOp;


after fixup, the "k in s" will plus 5 bytes code than before;not modify the SYSTEM.BIT function
and "3 IN s" const k expression;
the previous one I say it had bug, for having modified the SYSTEM.BIT funtion ,produced the wrong codes. this time I fixed it.

PS: the undocument function SYSTEM.BIT is for code efficiency, no check range [0,31];can be used
bit test for large size bitmap.
there some test for it:
Код:
   PROCEDURE S_BIT();  (* S.BIT(adrOfBITMAP,k) *)
      VAR s:ARRAY 12 OF SET;k:INTEGER;
   BEGIN
      IF S.BIT(S.ADR(s),k) THEN END;
   END S_BIT;

PROCEDURE Bit*(); 
      VAR b:BOOLEAN;x,k:INTEGER; s:ARRAY 100 OF SET;
   BEGIN
      s[0]:={1}; s[99] :={1};
      
      k:=1;
      b := S.BIT(S.ADR(s),k);
      Log.Bool(b);Log.Ln;
      k:=2;
      b := S.BIT(S.ADR(s),k);
      Log.Bool(b);Log.Ln;
      
      k:=32*99+1;
      b := S.BIT(S.ADR(s),k);
      Log.Bool(b);Log.Ln;
      
      k:=32*99+2;
      b := S.BIT(S.ADR(s),k);
      Log.Bool(b);Log.Ln;
      
   END Bit;

luowy


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Четверг, 17 Ноябрь, 2016 09:38 

Зарегистрирован: Четверг, 12 Июнь, 2008 17:30
Сообщения: 35
an improved one, consider the "range check" option.
DevCPC486.In
Код:
   PROCEDURE In* (VAR x, y: DevCPL486.Item);
      VAR L1: DevCPL486.Label; c: DevCPL486.Item;
   BEGIN
      L1:=DevCPL486.NewLbl;
      IF y.form = Set THEN
         CheckRange(x, 0, 31);
         IF  (x.mode # Con) & ~ranchk THEN
            DevCPL486.MakeConst(c, 31, x.form); DevCPL486.GenComp(c, x);
            DevCPL486.GenJump(ccA,L1,TRUE);
         END;
      END;
      DevCPL486.GenBitOp(BT, x, y);
      DevCPL486.SetLabel(L1);
      Free(x); Free(y);
      SetCC(x, lss, FALSE, FALSE);
   END In;

DevCPV486.condition, a bug fixup;
Код:
| in: DualExp(n.left, n.right, x, y, {}, {}, {short, mem, stk,AX}, {con, stk});
            DevCPC486.In(x, y)
         | bit: Check(n.left, ux, sx);
            Expr(n.right, x, {}, ux + {short,con}); (*here  add "con" *)
            Mem(n.left, y, DevCPT.notyp, {}, {});
            DevCPC486.Load(x, {}, {short});
            DevCPC486.In(x, y)
         | queryfn:


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Четверг, 17 Ноябрь, 2016 16:13 

Зарегистрирован: Четверг, 12 Июнь, 2008 17:30
Сообщения: 35
DevCPV486.condition
Код:
| in: DualExp(n.left, n.right, x, y, {}, {}, {short, mem, stk,AX}, {con, stk});
to
Код:
| in: DualExp(n.left, n.right, x, y, {}, {}, {short, mem, stk}, {con, stk});

the AX is used by Евгений Темиргалеев's proposal case, here no need at all. sorry for my carelessness.
I hope this forum can edit myself post freely without time limited.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пятница, 18 Ноябрь, 2016 02:20 
Модератор
Аватара пользователя

Зарегистрирован: Среда, 16 Ноябрь, 2005 00:53
Сообщения: 4488
Откуда: Россия, Орёл
Trurl писал(а):
Зачем? Чтение же, не запись.

Или Вы хотите полностью легализовать IN с любыми целыми?
Вирт предложил побитовые операции выражать через язык множеств. Отражаются они один в один. Выбиваются из схемы прямого отражения на побитовые операции только "конструирование" множеств {n} {n..m}, что Вирт и отмечает (http://oberoncore.ru/library/wirth_sets). И проверка n IN X, которая сводится к "конструированию" {n} /\ X # {}.

Если говорить непосредственно про побитовые сдвиги или проверку битов, какими эти операции реализуются, то явным образом выходит разрядность (контроль границ) и различия в машинных операциях. Например, на арме (см. примеры Вирта) сдвиг превышающий разрядность даёт 0, тогда как в интеле выполняется по модулю разрядности. На языке же множеств эти различия скрываются и есть два варианта:
1) требовать, чтобы операнды {n} {n..m} были в границах разрядности --- как в КП
2) конструировать с оглядкой на универсальное множество result = {n..m} /\ {0..MAX(SET)}. Тогда IN легализуется для любых целых.

Считаю вариант (2) более логичным, поскольку он доводит до конца идею внедрения языка множеств без потери эффективности. Во-первых, конструирование не касается эффективности --- "основных" операций not or xor and. Во-вторых, полностью "легализует" одну из самых "красивых" конструкций языка множеств n IN X. См. пример Вирта (n = 2) OR (n = 3) OR (n = 5) OR (n = 7) OR (n = 11) OR (n = 13) OR (n = 17) <=> n IN {2, 3, 5, 7, 11, 13, 17}). В случае, скажем, проверки предусловий такой конструкцией мы не можем требовать, чтобы n было в границах разрядности. Половина "красот" пропадает: (0 <= n) & (n <= 31) & (n IN {2, 3, 5, 7, 11, 13, 17}).

Если же говорить про (1), то выход за границы в этом случае ближе к переполнению при арифметических операциях, чем к проверке индексов массивов. А поскольку у нас "золотая середина", и переполнения проверяются только при включении всех проверок, то я признаю нелогичность в своих требованиях безусловного контроля границ выше.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 23 ]  На страницу 1, 2  След.

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Вся информация, размещаемая участниками на конференции (тексты сообщений, вложения и пр.) © 2005-2019, участники конференции «OberonCore», если специально не оговорено иное.
Администрация не несет ответственности за мнения, стиль и достоверность высказываний участников, равно как и за безопасность материалов, предоставляемых участниками во вложениях.
Без разрешения участников и ссылки на конференцию «OberonCore» любое воспроизведение и/или копирование высказываний полностью и/или по частям запрещено.
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB