2012-03-29 58 views
3

我需要將標記添加到C++代碼中,這些代碼應該在程序集或二進制文件中可見。這似乎是直截了當地做它使用內聯彙編32:如何將彙編標記添加到C++代碼(x64)

__asm { 
    NOP 
    NOP 
    NOP 
} 

或使用DB彙編語句:

__asm { 
    DB 0x00, 0xFF, 0x10 
} 

但VisualStudio的2005年和更好的不支持內嵌彙編的64位。有什麼辦法可以做到嗎?也許我可以在獨立的彙編模塊中創建一個函數,但是我怎樣才能確保鏈接器將實際彙編代替CALL?

+1

鏈接器沒有放入'CALL'指令,它只是放在實際地址中。編譯器將把'CALL'放到你的程序集中。但爲什麼你需要這個?不是'CALL知名地址'可用作標記嗎? – MSalters 2012-03-29 12:38:00

+0

是的,它可能是這樣的:找到標記和它的地址,然後找到這個地址的CALL。 – ChatCloud 2012-03-29 12:50:07

+0

其實,它的好解決方案。有一些相關文章http://www.codereversing.com/blog/?p=69 – ChatCloud 2012-05-03 15:04:11

回答

2

在某處定義一個全局volatile變量,如volatile __int64 blah = 0;。然後,無論你想要一些標記,使用_InterlockedCompareExchange64(&blah, SOME_UNIQUE_CONSTANT1, SOME_UNIQUE_CONSTANT2);。您將被保證找到加載ECX:EBXSOME_UNIQUE_CONSTANT1EDX:EAXSOME_UNIQUE_CONSTANT2其次是LOCK CMPXCHG8B(0xF0,0x0F,0xC7等 - 請參閱指令編碼細節)的指令。

+0

謝謝你的詳細答案,這很有道理。 – ChatCloud 2012-04-11 12:45:46

1

MSDN表示您可以使用內在函數。

+0

可能更有助於指向'__nop'內部:http://msdn.microsoft.com/en-us/library /aa983381(v=vs.80).aspx – Necrolis 2012-03-29 13:55:15

+0

http://msdn.microsoft.com/en-US/library/26td21ds.aspx說:「而且,優化程序可以擴展內在的不同」。我不知道優化器可以刪除NOP。 – ChatCloud 2012-03-29 14:16:16

+1

@Activation - 優化程序可以針對不同的參數以不同的方式擴展本質。就像爲固定大小的塊執行'memcpy'比可變長度更好。如果你添加'__nop'你顯然希望它在那裏,所以編譯器不會刪除它。 – 2012-03-29 20:55:47

0
//MyAsmCode.asm 
.code 
    MyFunction proc 
    ... 
    MyFunction endp 
end 

編譯它(ml64.exe)。

你得到的目標文件(MS COFF 64):MyAsmCode.obj

在VS添加MyAsmCode.obj到鏈接器的其它DEP。

現在你可以調用這個函數。 ;)

+0

如何確保鏈接器將嵌入MyFunction而不是執行CALL? – ChatCloud 2012-04-11 12:37:22

+0

描述你需要它的細節,我想我可以幫你 – Evgeny 2012-04-12 10:37:36