2012-01-25 109 views
0

我有以下C++ ASM內聯如何在ASM中使用struct成員?

struct john { 
    int oldA; 
    int A; 
} myJohn; 
DWORD gotoAddressBack = 0x00401000; 

void __declspec(naked) test(void) { 
    __asm { 
     MOV myJohn.oldA, DWORD PTR DS:[ESI+0x77C] 
     MOV DWORD PTR DS:[ESI+0x77C], myJohn.A 
     JMP gotoAddressBack 
    } 
} 

你可以告訴這兩個MOV的生成error C2415: improper operand type.

正如你可以看到我想要做的是店[ESI + 0x77C]的數值爲myJohn.oldA

然後我想更換相同[ESI + 0x77C]的值與myJohn.A

+0

爲什麼你需要處理DS? –

+0

那麼4個字節的值被存儲在內存中,並且在ESI改變之前,ESI每秒都會改變爲一個新值,我必須將ESI + 0x77C的值替換爲我自己的值...並存儲舊值以供參考。如果你感興趣的測試()函數被綁在被調用的目標 – SSpoke

+0

目標一小補丁我不知道它爲什麼DS ..多數民衆贊成在我想修補寄存器爲不同的價值之前是如何。它的工作原理..如果我只是代替myJohn.A就像'12345'一樣,而不是完美地應用這些更改。如果任何人都可以告訴我如何在不使用結構的情況下執行此操作,例如只使用int oldA = 0;'int A = 0;'這也是有用的..對我無關緊要。多一點對我來說打包/整理者 – SSpoke

回答

3

沒有用於MOV指令存儲器/存儲操作數。你應該使用一個寄存器來進行這種使用。這是類似的東西:

void __declspec(naked) test(void) { 
    __asm { 
     MOV EAX, DWORD PTR [ESI+0x77C] 
     MOV myJohn.oldA, EAX 

     MOV EAX, myJohn.A 
     MOV DWORD PTR [ESI+0x77C], EAX 

     JMP gotoAddressBack 
    } 
} 

順便說一句,我真的懷疑你真的要對付下現代操作系統的段寄存器(由於虛擬內存,即可以使用直接地址)。上述變更後您應該檢查您的代碼。

+0

是的,謝謝OSMAN Turan,只是測試和yup,完美的作品。 – SSpoke