![](/img/trans.png)
[英]How to do a naked function and inline assembler in x64 Visual C++
[英]How to access C arrays from assembler for Windows x64?
我編寫了一個匯編程序函數來加速圖像處理的一些事情(使用CreateDIBSection創建圖像)。
對於Win32,匯編程序代碼可以正常工作,但對於Win64,一旦我嘗試訪問我的數組數據,我就會崩潰。
我將相關信息放在結構中,我的匯編程序函數獲取指向此結構的指針。 結構指針放在ebx / rbx中,通過索引我從結構中讀取數據。
知道我做錯了什么嗎? 我將nasm與Visual Studio 2008一起使用,對於Win64,我設置了“default rel”。
C ++代碼:
struct myData {
tUInt32 ulParam1;
void* pData;
};
CallMyAssemblerFunction(&myData);
匯編代碼:
Win32的:
...
push ebp;
mov ebp,esp
mov ebx, [ebp + 8]; pointer to our struct
mov eax, [ebx]; ulParam1
mov esi, [ebx + 4]; pData, 4 byte pointer
movd xmm0, [esi];
...
Win64平台:
...
mov rbx, rcx; pointer to our struct
mov eax, [rbx]; ulParam1
mov rsi, [rbx + 4]; pData, 8 byte pointer
movd xmm0, [rsi]; CRASH!
...
很可能, pData
字段位於[rbx + 8]
,而不是[rbx + 4]
。 編譯器在ulParam1
和pData
之間插入一些額外的空格(“填充”),以便pData
是8字節對齊的(這使得訪問更快)。
看看你的記憶中的穿刺。 可能是x64中的偏移量不同
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.