アカウント名:
パスワード:
どのCPUだったかなぁ。同じレジスタに値を代入するコードになってるのは。
下手になんかするとflagが変わる可能性がある。
あと、00がNOPであってほしい。
マスクROMにパッチ当てるときに便利だから。
マスクは無理なんぢゃ... OTP の誤り?
パターンを物理的に切ると「0」になります。封止する前ならいけるかな?
Z80では?
それは 7F.
ARMがそうだったはず
知らんけど
昔はNOP専用命令は持ってませんでしたが、Cortex-ほげほげとか言うようになった頃からNOP命令が追加されてます。
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は必ず不当命令例外を起こすようになってます。
似たような話では、8086が命令構成ではXCHG AX,AXだったはず(AXレジスタとAXレジスタの交換)
これのおかげでx64命令が酷いことになってんですよね。XCHG AX,AXを表す命令コードは32bit/64bitモードではXCHG EAX,EAXになって、32bitではこれで問題ないんですが、64bitモードだとEAXへ書き込みを行うとRAX(64bit拡張されたEAX)の上位32bitをクリアする仕様になっていて、NOPでこれが適用されるとRAXの値が破壊されてしまう。そのため、XCHG EAX,EAX「だけ」特別扱いしてレジスタ破壊が起きないようになってるのでした。
結果からするとその通りですが、説明としては、XCHG EAX,EAXだけ特別扱いしているというより、90hは「XCHG EAX,EAX」ではなく「NOP」に割り当てられている、という言うべきじゃないですかね。
無駄なレジスタへの書き戻しは行わないし、EAXレジスタ依存判定もしないようにしてるので、前後のEAXを使うコードに対してアウトオブオーダー入れ替え可能だし高速に実行できるようになってます。
それはCPUがアウトオブオーダー実行やレジスタリネーミングなどを行うようになってからの後付けの理屈で、8086の時代はXCHG AX,AXが何もしないからという理由でNOPに選ばれたのでしょ。
より多くのコメントがこの議論にあるかもしれませんが、JavaScriptが有効ではない環境を使用している場合、クラシックなコメントシステム(D1)に設定を変更する必要があります。
人生unstable -- あるハッカー
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に選ばれたのでしょ。