2011-08-13 114 views
13

我剛在我的32位Vista盒子上安裝了mingw32以試驗gcc內聯彙編。不幸的是,32位gcc編譯器無法識別64位寄存器 ,如%% rax。在32位窗口下的64位寄存器

之前我沉了大量的時間到試圖組建一個新的工具鏈,我有幾個問題:

  1. 是否有在x86(英特爾酷睿雙核,T5800),以防止它的一些處理器模式從運行Vista32時使用64位寄存器(即這是一個失敗的原因)?

  2. 假設#1的答案是「當然你可以在32位窗口下使用%rax等」,gcc可以配置爲識別64位寄存器並構建一個可運行的可執行文件32位窗口?我知道gcc有一個-m64選項,但是我的版本隨mingw32一起編譯時沒有64位支持。如果可以構建可訪問64位的32位應用程序,我肯定會重建gcc登記冊,但如果它無法正常工作,我不想經歷那種痛苦。

旁白:這實際上是對學習的SSE2指令集(是的,我知道,編譯器內在存在,但我想從一臺機器最多級理解它)的第一步。

在此先感謝您的任何答案!

-Jim

回答

6
  1. 是的,在64位處理器具有3種大小模式,16位,32位和64位。操作系統無法以比操作系統本身更大的模式運行代碼。因此Vista 32位只能運行爲16位和32位構建的代碼。你的處理器does indeed support 64-bits,所以你應該嘗試在它上面安裝一個64位操作系統。如果您的計算機附帶有實際的Windows Vista光盤,則可能會有另一張用於Vista 64的CD。如果您使用x86-64支持構建新的工具鏈,您將能夠編譯使用64位指令和寄存器的代碼,但是您將除非安裝64位操作系統,否則無法運行生成的可執行文件。

  2. 由於rax是一個64位寄存器(32位等效爲eax),除64位程序外無法訪問。其原因是處理器如何解釋程序發送的命令的一個相當複雜的解釋。

但是,您實際上不需要訪問64位代碼以使用MMX,SSE,SSE2和SSE3。所有這些指令都可以在32位模式下使用,並由處理器支持。

您也可能想考慮運行虛擬機並將Ubuntu放入其中。這將允許您在Windows桌面上的窗口中運行Linux。我想你本來會比使用mingw32更容易使用GNU工具鏈(gcc等)。虛擬機很容易安裝和使用在這個時代,幾乎沒有理由再使用mingw32。您也可以查看MS Visual C++ Express,這是一種免費的基於Windows的編譯器,但它不支持64位(您必須付費才能購買)。

+0

非常感謝您的回答。回覆:64位Vista ...我通過一個接口(我認爲)使用未簽名的驅動程序連接到微控制器,所以沒有喜悅。我可以在32位窗口下運行64位虛擬機嗎?我目前在VMware下有32位RH9和Fedora 11。我會研究64位虛擬機。我可能會略過64,但如果我可以從32位訪問SSE2(我錯誤地認爲SSE2只能從64位獲得)。再次,謝謝! – Jim

+1

我不會說這是錯綜複雜的。不支持的主要原因是32位操作系統不會保存/恢復任務開關上的所有寄存器。操作系統總是必須知道如何保存/恢復進程所看到的所有架構狀態。 (這是在用戶空間進程可以使用SSE之前需要OS支持的原因,但MMX不需要額外的支持)。 –