nodocumentsの日記: NOP 23
日記 by
nodocuments
try catch書くときは何もなくてもとりあえずfinallyも書くんだけど、中に //NOP と書いてふと
(今どきオペコード知ってる人のほうが少なくね?)
ちょっと周囲の人に"コメントにNOPって書かれてて意味わかる?"と訊いてみた
うん、コメントにNOPはやめよう
try catch書くときは何もなくてもとりあえずfinallyも書くんだけど、中に //NOP と書いてふと
(今どきオペコード知ってる人のほうが少なくね?)
ちょっと周囲の人に"コメントにNOPって書かれてて意味わかる?"と訊いてみた
うん、コメントにNOPはやめよう
人生の大半の問題はスルー力で解決する -- スルー力研究専門家
LD A,A (スコア:2)
どのCPUだったかなぁ。
同じレジスタに値を代入するコードになってるのは。
下手になんかするとflagが変わる可能性がある。
Re:LD A,A (スコア:2)
あと、00がNOPであってほしい。
マスクROMにパッチ当てるときに便利だから。
Re:LD A,A (スコア:1)
Re: (スコア:0)
マスクは無理なんぢゃ... OTP の誤り?
Re:LD A,A (スコア:2)
パターンを物理的に切ると「0」になります。
封止する前ならいけるかな?
Re: (スコア:0)
Z80では?
Re:LD A,A (スコア:1)
Re: (スコア:0)
それは 7F.
Re: (スコア:0)
ARMがそうだったはず
知らんけど
Re:LD A,A (スコア:1)
Re: (スコア:0)
昔はNOP専用命令は持ってませんでしたが、Cortex-ほげほげとか言うようになった頃からNOP命令が追加されてます。
Re: (スコア:0)
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は必ず不当命令例外を起こすようになってます。
Re: (スコア:0)
似たような話では、8086が命令構成ではXCHG AX,AXだったはず(AXレジスタとAXレジスタの交換)
Re: (スコア:0)
これのおかげでx64命令が酷いことになってんですよね。
XCHG AX,AXを表す命令コードは32bit/64bitモードではXCHG EAX,EAXになって、32bitではこれで問題ないんですが、64bitモードだとEAXへ書き込みを行うとRAX(64bit拡張されたEAX)の上位32bitをクリアする仕様になっていて、NOPでこれが適用されるとRAXの値が破壊されてしまう。そのため、XCHG EAX,EAX「だけ」特別扱いしてレジスタ破壊が起きないようになってるのでした。
Re: (スコア:0)
結果からするとその通りですが、説明としては、XCHG EAX,EAXだけ特別扱いしているというより、90hは「XCHG EAX,EAX」ではなく「NOP」に割り当てられている、という言うべきじゃないですかね。
無駄なレジスタへの書き戻しは行わないし、
EAXレジスタ依存判定もしないようにしてるので、
前後のEAXを使うコードに対してアウトオブオーダー入れ替え可能だし高速に実行できるようになってます。
Re: (スコア:0)
それはCPUがアウトオブオーダー実行やレジスタリネーミングなどを行うようになってからの後付けの理屈で、8086の時代はXCHG AX,AXが何もしないからという理由でNOPに選ばれたのでしょ。
そういう時は (スコア:0)
// pass through
と書く事が多いな。No OPpaiとは書かない(違
Re:そういう時は (スコア:1)
自分は
// Do nothing.
Re:そういう時は (スコア:1)
私も「do nothing」ですね。if文で使うことが多いです。else if が並ぶところで、一個do nothing を入れたほうがすっきりする場合とか。
switch-case で、breakが無いところの注意書きは「pass through」
Re: (スコア:0)
>switch-case で、breakが無いところの注意書きは「pass through」
fallthrough の方が良いのでは。C++17 では、[[fallthrough]];
あなたが言っても (スコア:0)
コメントも大事だが、ドキュメントも書いてくれ
Re:あなたが言っても (スコア:1)
nodocumentsがdocument作ったら存在できなくなっちゃうじゃないですか!
NOPって (スコア:0)
サーキット上では何もするなっていう英霊だから
つまり「だ・ま・れ」ってことかの?