2013-09-28 113 views
4

我的環境是64位win7,VC2010。是否有可能在intel/64位win7上的32位應用程序中使用64位指令

當然,intel裏面是64位的CPU。

我可以在32位應用程序中使用64位指令/本機機器字(64位)嗎?由於我的大部分代碼都是32位的,我不想將它移植到64位。我想通過編譯器內部或內聯彙編(也是64位VC編譯器不支持內聯彙編)手動優化它,是否有可能運行64位代碼fox示例mov rax ,在32位模式應用程序中的rbx?

+0

可能的重複[在32位Windows下使用Amd64指令的輕量級方法?](http://stackoverflow.com/questions/7133078/lightweight-method-to-use-amd64-instructions-under-32bit -windows) –

+3

@John Zwinck:不,它不是重複的。這裏的操作系統是64位。 –

+0

順便說一下,當使用MSVC定位64位時,您仍可以鏈接分別彙編的代碼。 – harold

回答

4

如果您的應用程序使用32位指令集,則不可以選擇在同一應用程序中「有時」使用64位指令。有一些選擇,但是:

  • 使用SIMD指令,如SSE,AVX等,這是記錄在這裏:http://msdn.microsoft.com/en-us/library/t467de55(v=vs.90).aspx
  • Port的32位代碼爲64位。也許它不那麼難?
  • 將程序拆分爲兩部分:使用舊代碼的32位進程和使用新代碼的64位進程。你可以在它們之間映射內存,並且可以啓動另一個,所以它有點像多線程程序。它是否表現良好取決於我們目前不知道的細節。
9

其實你可以。用於從32位切換到64位模式(顯然必須存在於64位操作系統上才能運行32位代碼)的機制不受任何保護,可以從用戶代碼中使用。在Windows上,它被稱爲Heaven's Gate,它非常簡單:只需要​​一個33h段選擇器就可以進行遠程調用。

那麼,如何運行64位代碼呢?

call 33h:your64bitcode 
... 
your64bitcode: 
; do something 
retf 

有,當然,一些限制,你可以以這種方式進入的,因爲你在一個64位的過程確實不是64位的代碼做什麼。

+0

您可以在Windows上以PE32-in-seg64的身份執行64位系統調用(您可以在Linux中)(http://stackoverflow.com/a/32384358/673852)? – Ruslan

+0

@Ruslan在原始系統調用?我從來沒有嘗試過,但我沒有看到他們不工作的直接原因。在kernel32.dll中調用東西的通常方式比較困難,因爲加載了錯誤的版本,並且不能使用'LoadLibrary',但是仍然有一些技巧可以加載它 – harold

+0

我的意思是原始系統調用 - 那些由'syscall'指令調用的系統調用。 – Ruslan

相關問題