usakdsteen

ゆうさくですてぃーん

2021年03月29日(Mon)の独り言

の呟きは 25

 < の独り言 | の独り言 | の独り言 > 
  •  #

    買った

    f:id:neetsdkasu:20210329171219p:plain
  •  #

    マイナンバーカード、申請から2週間経つけど
    未だ音沙汰なし・・・
    申請がかなり殺到してて混んでいるとかかな・・・

  •  (UPD ) #

    次はこれ

    Dim s As String
    Dim n As Integer
    Do
    Print "Number?"
    Input s
    If s = "end" Then
    Exit Do
    End If
    n = CInt(s)
    If n < 1 Then
    Print "Invalid Input"
    Continue Do
    End If
    If n Mod 15 = 0 Then
    s = "FizzBuzz"
    ElseIf n Mod 3 = 0 Then
    s = "Fizz"
    ElseIf n Mod 5 = 0 Then
    s = "Buzz"
    Else
    s = CStr(n)
    End If
    Print s
    Loop

    •  #

      (omitted)

    •  #

      次は
      n = CInt(s)

      •  #

        次は n < 1 の部分
        {lhs_reg} < {rhs_reg}
        なので
        {lhs_reg} - {rhs_reg} < 0
        なので
        SUBA {lhs_reg},{rhs_reg}
        SRA {lhs_reg},15
        とすれば
        負数のときは-1 (True)、それ以外は0 (False)
        になる

    •  #

      次は整数の一致判定の等号演算子

      If n Mod 15 = 0 Then が動くようにする

      •  #

        さて、さっきのn < 0は差分で求まるんだが
        一致はどうすれば求まるのか・・・

        •  (UPD ) #

          愚直にやると等号演算子のたびにラベルを1つ消費することになるんだが・・・

          •  #

            サブルーチン化すると
            大げさにはなるものの
            ラベルの消費を抑えられる・・・

            •  #

              レジスタ退避とかのコードが必要になるかもだが

        •  #

          if a - b = 0 -> -1 (True)
          if a - b < 0 -> 0 (False)
          if a - b > 0 -> 0 (False)

          フラグレジスタ判定だと、ラベルジャンプが必須になる・・・

          •  #

            ジャンプなしの強引だと・・・

            SUBA {lhs},{rhs}
            LD {rhs},{lhs}
            XOR {rhs},=#FFFF
            LAD {rhs},1,{rhs}
            SRA {lhs},15
            SRA {rhs},15
            OR {lhs},{rhs}
            XOR {lhs},=#FFFF

            か?

            •  #

              ジャンプやると

              SUBA {lhs},{rhs}
              JZE J1
              LAD {lhs},-1
              J1 XOR {lhs},=#FFFF

              シンプル

              •  #

                サブルーチンだと・・・
                ; PUSH 0,GR1
                ; PUSH 0,GR2
                PUSH 0,{rhs}
                LD GR1,{lhs}
                POP GR2
                CALL C1
                ; POP GR2
                ; POP GR1
                LD {lhs},GR0


                C1 XOR GR0,GR0
                CPA GR1,GR2
                JNZ J1
                LAD GR0,-1
                J1 RET

                か?

                •  #

                  比較サブルーチンにすると

                  ; PUSH 0,GR1
                  ; PUSH 0,GR2
                  PUSH 0,{rhs}
                  LD GR1,{lhs}
                  POP GR2
                  CALL C1
                  SLL GR0,15
                  SRA GR0,15
                  XOR GR0,=#FFFF
                  ; POP GR2
                  ; POP GR1
                  LD {lhs},GR0


                  C1 XOR GR0,GR0
                  CPA GR1,GR2
                  JZE J2
                  JPL J1
                  LAD GR0,-1
                  J1 OR GR0,=1
                  J2 RET

                  か?

              •  #

                公式シミュレータだと
                ラベル200個という制限があるからな・・・

            •  #

              これ、もうちょっとシンプルにできないかなあ

              •  #


                SUBA {lhs},{rhs}
                LD {rhs},{lhs}
                XOR {rhs},=#FFFF
                LAD {rhs},1,{rhs}
                OR {lhs},{rhs}
                SRA {lhs},15
                XOR {lhs},=#FFFF


                SRAが1つ要らんよな

                •  #

                  命令量かラベル量かのトレードオフだなあ・・・

                  •  #

                    ソースコードは1000行以内
                    ラベルは200個以内

                    か…

                    •  #

                      どっちも厳しいなあ・・・

                  •  (UPD ) #

                    今回は
                    命令3行 or ラベル1個


                    3行/1000行

                    1個/200個 = 5/1000
                    では…
                    まぁ単純比較ではラベルのほうがコスト高いが

                    •  #

                      まぁ、5行につき1個ラベルを使えるという単純計算も成り立つし
                      ジャンプラベルとしてはそう高頻度で出てくるものではないが、
                      データ保管(DS/DC)としてのラベルは…5行中5個ラベル消費になるからな・・・

                      •  (UPD ) #

                        1000行制限だと
                        DSで適当なサイズ確保しての動的割り当てなコードを追加なんてのも厳しいだろうしなあ
                        まぁ、ラベル節約にはなっても、コンパイル自体の実装難易度がかなーり上がるんだよな、今の静的割り当てのかなーり楽なことか・・・

                        •  #

                          FizzBuzzでさえ、200行クラスの量になってるもんな・・・

  •  (UPD ) #

    https://abcnews.go.com/International/engineers-start-refloat-ship-stuck-egypts-suez-canal/story?id=76743668

    Kaishaて、正式名称がそれだからか・・・?

    f:id:neetsdkasu:20210329233109p:plain
 < の独り言 | の独り言 | の独り言 >