組立て:間を移動する二つのメモリのアドレス
-
18-09-2019 - |
質問
私を学習しようとしている組立(いん)となっているコンパイルエラーが発生したこのライン:
mov byte [t_last], [t_cur]
のエラー
error: invalid combination of opcode and operands
疑いるこのエラーの原因というわけで、することができません、mov指導を移動する二つのメモリのアドレス、半時間のgooglingなんと確認できてここに。
また、私は利用できるよう、ぜひ利用する必要はあり登録の中間点のコピーメモリ:
mov cl, [t_cur]
mov [t_last], cl
きむすびにしていただきましたおすすめの登録利用(またはどちらを使うべきスタックの代わりに)?
解決
あなたの疑惑が正しいか、あなたはメモリにメモリから移動することはできません。
任意の汎用レジスタが行います。あなたはその中だし、それが戻って一度行って復元することがわからない場合は、レジスタをプッシュすることを忘れないでください。
他のヒント
これは、16ビットでは本当に簡単です、ちょうど次の操作を行います:
push di
push si
push cx
mov cx,(number of bytes to move)
lea di,(destination address)
lea si,(source address)
rep movsb
pop cx
pop si
pop di
注:レジスタの内容を保存する必要がある場合はプッシュ&ポップがneceessaryある
。メモリにメモリからデータを移動するから、MOVS命令でもあります:
MOV SI, OFFSET variable1
MOV DI, OFFSET variable2
MOVS
メモリへのメモリから移動することは技術的に可能である。
の [E] SI と [E] DI の、かどうかに応じてのMOVS の(移動文字列)を使用して、設定してみてください あなたは、などのバイト(複数可)、ワード(複数可)、転送したい。
mov si, t_cur ; Load SI with address of 't_cur'
mov di, t_last ; Load DI with address of 't_last'
movsb ; Move byte from [SI] to [DI]
; Some dummy data
t_cur db 0x9a ; DB tells NASM that we want to declare a byte
t_last db 0x7f ; (See above)
これは、1つの一時レジスタを通常の負荷+ストアを使用するよりも効率的であるが、それは、単一の命令で実際のコピーをしますか。
ここでのはMOVS を使用する方法だし、それがどのように動作しますか: https://www.felixcloutier.com/x86/movs:movsb: MOVSW:MOVSD:movsqする
これは通常だけではなく、単一の要素に対して、ブロックコピーのrep
接頭辞を使用しています。 (現代のCPUはrep movsb
ため、かなり効率的なマイクロコードを持っていることAVXベクトルロード/ストア命令を使用してループの速度に近い。)
ことになる訂正、x86マシンコードできないエンコードの指示と 明示的な メモリのオペランド(任意のアドレスを指定 []
)
きむすびにしていただきましたおすすめの登録
任意に登録い保存/復帰いたします。
すべての主流は32-bitおよび64ビットの呼び出し規約EAX,ECX、EDXにはコclobbered、AL、CL、DLしています。のためのバイトや単語をコピーはたい movzx
負荷32ビットの登録は、8ビットまたは16ビットのお店です。これに虚偽の依存性の古い値を登録できます。のみを使用してくださ狭16または8ビット mov
負荷の場合を積極的に したい 合併の低ビットの値です。x86の movzx
のアナログの指示のようにアーム ldrb
.
movzx ecx, byte [rdi] ; load CL, zero-extending into RCX
mov [rdi+10], cl
64ビットモードでは、SIL,DIL,r8b,r9bでも選択する必要があるREXの接頭辞のマシンコード店のようにマイナーコードサイズの理由を回避してまいります。
一般的に書き込みを防ぐああ、BH、CH、DHパフォーマンス上の理由から、なんだをよく読み、理解したうえで、以下のリンクとして虚偽の依存関係は一部登録の統合屋台ない問題が起こるすべてのコードです。
(どちらを使うべきスタックの代わりに)?
まずはできません押し半角ので、あわないので、そんなことができるようになバイトロード/バイト店舗のスタックです。用語,dword、qwordによってCPUモード) push [src]
/ pop [dst]
, その多く以下のコピーを介するものとする。について紹介し、余分な店/リロード店-転送遅延の前のデータから読み込むことができるのが最終目的地は、ありますのでuops.
などのスタック は 希望の行先を表示すことはできませんの最適化とローカル変数への登録の場合 push [src]
では、イブレア城、イブレアにコピーであり、配分のスタックのスペースです。
見 https://agner.org/optimize/ その他のx86性能リンク これにはx86タグwiki
ちょうどあなたと「メモリバリア」を議論したいです。 Cコードで
a = b;//Take data from b and puts it in a
に組み付けることになる
mov %eax, b # suppose %eax is used as the temp
mov a, %eax
システムは、割り当てのアトミック性を保証することはできません。我々は、人民元を必要とする理由です (読み取りバリア)