簡體   English   中英

如何從匯編程序訪問Windows x64的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] 編譯器在ulParam1pData之間插入一些額外的空格(“填充”),以便pData是8字節對齊的(這使得訪問更快)。

看看你的記憶中的穿刺。 可能是x64中的偏移量不同

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM