私はこのコードを持っています。ここでwAddressはuint16_t変数へのポインタです。この種の操作は正確には何ですか?
uint8_t upperByte = *wAddress >> 8;
uint8_t lowerByte = *wAddress;
最初のシフト操作は、変数の値をwAddressで上書きしますか?
私はこのコードを持っています。ここでwAddressはuint16_t変数へのポインタです。この種の操作は正確には何ですか?
uint8_t upperByte = *wAddress >> 8;
uint8_t lowerByte = *wAddress;
最初のシフト操作は、変数の値をwAddressで上書きしますか?
コードがCまたはC++から来たと仮定すると(異なる言語が構文、演算子、および操作の順序を別々に扱うために指摘する価値があると仮定します)、そうでない場合、最初のシフトは変数。むしろシフトはレジスタ内のビットを上書きします。
ASMにコンパイルすると、コードが
uint16_t someInt = 61590; // Binary: 1111 0000 1001 0110
uint16_t *wAddress = &someInt;
uint8_t upperByte = *wAddress >> 8;
uint8_t lowerByte = *wAddress;
で、これは最初のあるwAddress
によって参照値をロードしようとしています。その値がレジスタに入ると、右に8ビットシフトします。つまり、下位8ビットが上位8ビットに置き換えられ、上位8がレジスタ内でゼロで埋められます。すなわち、0000 0000 1111 0000
(10進数で240)。その後、その値は新しい下位8ビットに切り捨てられ、upperByte
変数の値として保存されます。
この後、someInt
の別のコピーがレジスタにロードされ、今回は上位8ビットが破棄され、下位8ビットはlowerByte
の値として配置されます(シフトが行われなかったため)。
が実際にsomeInt
の値を上書きするには、明示的someInt = *wAddress >> 8;
を言わなければならないでしょう、someInt
に格納されている値のコピーだけが値がwAddress
自体によって指されるのではなく、変更されました。