アドレス ライン 4534342 などの特定の場所に XMM レジスタを格納しようとしています。
例:
私がやった事?
xmm レジスターに 128 ビット値が含まれていることはわかっています。したがって、私のプログラムはすでに割り当てられた 16 バイトのメモリを生成しています。さらに、レジスタはアラインされたデータであるため、31 バイトを割り当て、その中にアラインされたアドレスを見つけました。これにより、例外がスローされるのを防ぐことができます。
私は視覚的に何をしようとしていますか?
Mem Adr | Contents (binary)
4534342 | 0000 0000 0000 0000 ; I want to pass in address 4534342 and the
4534346 | 0000 0000 0000 0000 ; the program inline-assembly will store it
4534348 | 0000 0000 0000 0000 ; its contents straight down to address 45-
4534350 | 0000 0000 0000 0000 ; 34350
4534352 | 0000 0000 0000 0000
4534354 | 0000 0000 0000 0000
4534356 | 0000 0000 0000 0000
4534358 | 0000 0000 0000 0000
設定
cyg_uint8 *start_value; //pointer to the first value of the allocated block
cyg_uint32 end_address; //aligned address location value
cyg_uint32 *aligned_value; //pointer to the value at the end_address
start_value = xmm_container; //get the pointer to the allocated block
end_address = (((unsigned int) start_value) + 0x0000001f) & 0xFFFFFFF8; //find aligned memory
aligned_value = ((cyg_uint32*)end_address); //create a pointer to get the first value of the block
アセンブリ呼び出しの前にステートメントをデバッグして、機能を確認します
printf("aligned_value: %d\n", (cyg_uint32) aligned_value);
printf("*aligned_value: %d\n", *aligned_value);
アセンブリコール
__asm__("movdqa %%xmm0, %0\n" : "=m"(*aligned_value)); //assembly call
機能を保証するためのアセンブリ呼び出し後のステートメントのデバッグ
printf("aligned_value: %d\n", (cyg_uint32) aligned_value);
printf("*aligned_value: %d\n", *aligned_value);
printf からの出力 [FAILURE]
aligned_value: 1661836 //良さそうです!
*aligned_value: 0 //良さそうです!
aligned_value: -1 //間違っているように見えます:(
//その後、プログラムが動かなくなる
基本的に、このプロセスを正しく行っていますか? なぜ行き詰まると思いますか?
お時間とご尽力いただきありがとうございます。