あなたのプログラムは間違っています。技術的にはこれを行っています
uint64_t p = *((uint64_t*)0x8000000000123456ULL);
p += 0x8000000000000000ULL;
これは実際に上位ビットを切り替え、値に上位ビットが設定されている場合は正しい値を提供しません。実際、最上位ビットが設定されている場合はトラップされますdadd
。daddu
ビット単位の操作について詳しく読む必要があります。ビットをクリアand
するには、;を使用します。ビットor
の設定とトグルxor
に使用
MIPSでは、このようにすることができます
ldi $2, 0x8000000000123456
ld $3, 0($2)
lui $4, 0x8000 # $4 = 0x80000000
dsll $4, $4, 32 # $4 = 0x8000000000000000
or $4, $3, $4
sd $3, 0($2)
lui/dsll ペアは、即時ロード用です。これは、下位半分に 2 の累乗をロードしてから上位部分にシフトする同等のシーケンスに置き換えることができます。
MMIO を使用していない限り、「レジスタ アドレス」と呼ばれるものはないことに注意してください。メモリ位置へのアドレスを含むレジスタです。部分的なレジスタ アクセスを許可するリアル メモリまたは MMIO デバイスにアクセスしている場合は、特定のバイト、ハーフワード、またはワードをロードして編集するだけで代替ソリューションが得られます。
# byte
ldi $2, 0x8000000000123456 # assume big endian
lbu $3, 0($2)
ori $3, 0x80
sb $3, 0($2)
# halfword
ldi $2, 0x8000000000123456
lhu $3, 0($2)
ori $3, 0x8000
sh $3, 0($2)
# word
ldi $2, 0x8000000000123456
lbu $3, 0($2)
lui $4, 0x8000
or $3, $4, $3
sd $3, 0($2)