パスワードを忘れた? アカウント作成
13816518 journal
日記

nodocumentsの日記: NOP 23

日記 by nodocuments

try catch書くときは何もなくてもとりあえずfinallyも書くんだけど、中に //NOP と書いてふと
(今どきオペコード知ってる人のほうが少なくね?)
ちょっと周囲の人に"コメントにNOPって書かれてて意味わかる?"と訊いてみた
うん、コメントにNOPはやめよう

この議論は賞味期限が切れたので、アーカイブ化されています。 新たにコメントを付けることはできません。
  • by manmos (29892) on 2019年01月17日 14時06分 (#3549585) 日記

    どのCPUだったかなぁ。
    同じレジスタに値を代入するコードになってるのは。

    下手になんかするとflagが変わる可能性がある。

    • by manmos (29892) on 2019年01月17日 14時08分 (#3549592) 日記

      あと、00がNOPであってほしい。

      マスクROMにパッチ当てるときに便利だから。

      親コメント
      • by alp (1425) on 2019年01月18日 0時46分 (#3550111) ホームページ 日記
        手元の資料の命令セットざっと見た範囲だと、00 が NOP の物はほとんどないような気がする。i-8080 派生と、i-8048/51 関連、Fairchild の clipper ぐらい。どれもレジスタ間移動の流用ではなく、専用命令です。ミニコン系だともっと酷くて、NOVA が 0 番地に飛ぶ (リセット) 、PDP-11 は HALT する模様。
        親コメント
      • by Anonymous Coward

        マスクは無理なんぢゃ... OTP の誤り?

    • by Anonymous Coward

      Z80では?

    • by Anonymous Coward

      ARMがそうだったはず

      知らんけど

    • by Anonymous Coward

      Z80もARMもNOPには専用の命令コードが割り当てられてますよ。既に書かれているようにこれらのCPUはフラグを持っているので、演算命令で代替すると完全にNOPと等価にならないので。

      NOP専用の命令を持たない例として挙げられるのはMIPSですね。
      NOPはSLL r0,r0,0(r0レジスタを左に0ビットシフト)と同じ命令コードです。
      r0は元々書き換えできないzeroレジスタの上に0ビットシフトなんで、本当に何も起きません。MIPSはフラグがないのでそっちの影響もなし。
      更にこの命令、16進だと0x00000000です。

      MIPSに大きく影響を受けているRISC-VのNOPも同様で、こちらはADDI x0,x0,0(x0レジスタに0を足す)と同じ命令コードです。
      ただし、命令コードは0x00ではありません。RISC-Vは逆に、0で埋めてある領域を誤って実行したことを検出できるよう、0x00は必ず不当命令例外を起こすようになってます。

    • by Anonymous Coward

      似たような話では、8086が命令構成ではXCHG AX,AXだったはず(AXレジスタとAXレジスタの交換)

      • by Anonymous Coward

        これのおかげでx64命令が酷いことになってんですよね。
        XCHG AX,AXを表す命令コードは32bit/64bitモードではXCHG EAX,EAXになって、32bitではこれで問題ないんですが、64bitモードだとEAXへ書き込みを行うとRAX(64bit拡張されたEAX)の上位32bitをクリアする仕様になっていて、NOPでこれが適用されるとRAXの値が破壊されてしまう。そのため、XCHG EAX,EAX「だけ」特別扱いしてレジスタ破壊が起きないようになってるのでした。

        • by Anonymous Coward

          結果からするとその通りですが、説明としては、XCHG EAX,EAXだけ特別扱いしているというより、90hは「XCHG EAX,EAX」ではなく「NOP」に割り当てられている、という言うべきじゃないですかね。

          無駄なレジスタへの書き戻しは行わないし、
          EAXレジスタ依存判定もしないようにしてるので、
          前後のEAXを使うコードに対してアウトオブオーダー入れ替え可能だし高速に実行できるようになってます。

          • by Anonymous Coward

            それはCPUがアウトオブオーダー実行やレジスタリネーミングなどを行うようになってからの後付けの理屈で、8086の時代はXCHG AX,AXが何もしないからという理由でNOPに選ばれたのでしょ。

  • by Anonymous Coward on 2019年01月17日 11時33分 (#3549457)

    // pass through

    と書く事が多いな。No OPpaiとは書かない(違

  • by Anonymous Coward on 2019年01月17日 15時15分 (#3549658)

    コメントも大事だが、ドキュメントも書いてくれ

  • by Anonymous Coward on 2019年01月17日 23時06分 (#3550066)

    サーキット上では何もするなっていう英霊だから
    つまり「だ・ま・れ」ってことかの?

typodupeerror

人生の大半の問題はスルー力で解決する -- スルー力研究専門家

読み込み中...