2012-08-06 49 views
2

在以下代碼中,rEDX, rEBX, rEBP, rESI and rEDI是結構scratch_space的成員。 scratch_space_arg是結構scratch_space的一個對象。在內聯彙編中訪問C結構成員

lea eax, scratch_space_arg 
mov [ecx+[eax].rEDX], edx 
mov [ecx+[eax].rEBX], ebx 
mov [ecx+[eax].rEBP], ebp 
mov [ecx+[eax].rESI], esi 
mov [ecx+[eax].rEDI], edi 

此代碼給了我一個:

error C2426: '[' : illegal operator in 'first operand' 

所有mov語句。任何想法如何解決這個問題?

PS:我用this article訪問struct成員。

+0

你試過'[ecx + eax] .rEDX'嗎? – TonyK 2012-08-06 06:35:45

回答

2

我建議拆卸一些C代碼,引用結構元素:

struct scratch_space scratch_space_arg = { 0, 0, 0, 0, 0 }; 
int rEDX = scratch_space_arg.rEDX; 
int rEBX = scratch_space_arg.rEBX; 
int rEBP = scratch_space_arg.rEBP; 
int rESI = scratch_space_arg.rESI; 
int rEDI = scratch_space_arg.rEDI; 
printf("%d %d %d %d %d\n", rEDX, rEBX, rEBP, rESI, rEDI); 

然後你就會知道正確的符號來使用你自己。

+0

你試過這個嗎?我希望編譯器使用硬編碼的偏移量,這可能不是OP想要的。 – TonyK 2012-08-06 06:32:17

+0

我希望編譯器也使用硬編碼的偏移量......而這個技巧的一部分就是讓這些硬編碼的偏移量正確。然後,您可以進入彙編程序並將偏移量定義爲名稱 - 但必須正確定義這些定義。如果您不知道硬編碼偏移量,則無法生成正確的彙編程序,對嗎? (當然,這可能取決於你可用的彙編程序的強大功能,但是,Unix彙編程序往往是相當簡單的,MS彙編程序可能更強大,但你仍然需要知道偏移量,C編譯器知道他們;彙編程序不會)。 – 2012-08-06 07:23:54

+0

OP在C編譯器中使用內聯彙編程序。所以結構定義是可用的。 – TonyK 2012-08-07 06:07:38