-1

アドレス ライン 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 //間違っているように見えます:(

//その後、プログラムが動かなくなる

基本的に、このプロセスを正しく行っていますか? なぜ行き詰まると思いますか?

お時間とご尽力いただきありがとうございます。

4

1 に答える 1