2012-07-11 191 views
-1

我試圖存儲XMM寄存器到一定的位置,如地址線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

我不認爲你的對齊邏輯是正確的,如果你想有一個16字節對齊地址。

只是做數學題,很容易!:

(0 + 0x1F的)& 0xFFFFFFF8 =爲0x18; 0x18-0 =爲0x18未使用的字節,爲0x1F-爲0x18 = 7個字節左
(1 +爲0x1F)& 0xFFFFFFF8 = 0×20; 0x20-1 = 0x1F的未使用的字節,爲0x1F-0x1F的= 0字節左
...
(8 + 0x1f)& 0xFFFFFFF8 = 0x20; 0x20-8 = 0x18未使用字節,0x1F-0x18 =剩餘7字節
(9 + 0x1f)& 0xFFFFFFF8 = 0x28; 0x28-9 = 0x1F未使用字節,0x1F-0x1F = 0字節左
...
(0xF + 0x1f)& 0xFFFFFFF8 = 0x28; 0x28-0xF = 0x19未使用字節,0x1F-0x19 =剩餘6字節
(0x10 + 0x1f)& 0xFFFFFFF8 = 0x28; 0x28-0x10 = 0x18未使用字節,0x1F-0x18 =剩餘7字節
(0x11 + 0x1f)& 0xFFFFFFF8 = 0x30; 0x30-0x11 = 0x1F未使用字節,0x1F-0x1F = 0字節左
...
(0x18 + 0x1f)& 0xFFFFFFF8 = 0x30; 0x30-0x18 = 0x18未使用字節,0x1F-0x18 =剩餘7字節
(0x19 + 0x1f)& 0xFFFFFFF8 = 0x38; 0x38-0x19 = 0x1F未使用字節,0x1F-0x1F = 0字節左
...
(0x1F + 0x1f)& 0xFFFFFFF8 = 0x38; 0x38-0x1F = 0x19未使用字節,0x1F-0x19 =剩餘6字節

首先,要獲得4個最低有效位中的全零,掩碼應爲0xFFFFFFF0。

接下來,如果您以這種方式計算對齊的地址,則會溢出31字節的緩衝區。你的數學留給你0到7個字節的空間,這不足以存儲16個字節。

對於正確的16字節對齊,你應該這樣寫:

end_address = (((unsigned int)start_value) + 0xF) & 0xFFFFFFF0;

+0

我明白你的意思,但可惜還是用-1 :( – bluejamesbond 2012-07-11 21:26:39

+0

相同的輸出我道歉凍結,我實習生嘗試學習這些東西,但我還沒有學會通過工具,所以這就是爲什麼我問。只是fyi – bluejamesbond 2012-07-11 21:29:54

+3

然後學習工具。今天。 – 2012-07-11 21:38:34