基本上,我想知道的是,x86-64操作系統如何運行爲x86機器編譯的代碼。我知道第一個x64系統何時推出,這不是它們中的任何一個的特徵。之後,他們設法做到了這一點。x64操作系統如何運行爲x86機器編譯的代碼
請注意,我知道x86彙編語言是x86-64彙編語言的一個子集,ISA的設計方式可以支持向後兼容性。但是,這裏讓我困惑的是堆棧調用約定。這些約定根據架構而有很大差異。例如,在x86中,爲了備份幀指針,進程將其指向堆棧(RAM)的位置並在完成後彈出。另一方面,在x86-64中,進程不需要更新幀指針,因爲所有的引用都是通過堆棧指針給出的。其次,在x86架構中,函數參數在x86-64中通過堆棧傳遞,寄存器用於此目的。
x86-64和x64架構的堆棧調用約定之間的差異可能不會影響程序堆棧增長的方式,只要不同的約定不會同時使用,這種情況大多是這種情況,因爲x32函數被調用其他x32和x64相同。但是,在某一點上,一個函數(可能是一個系統函數)會調用一個函數,該函數的代碼是用一些參數爲一個x86-64機器編譯的,在這一點上,我很好奇OS(或其他控制單元)如何處理讓這個功能起作用。
在此先感謝。
感謝您提供全面和明確的答案。 x86指令(利用32位寄存器 - eax,ebx等)可以在64位進程中執行嗎?例如:在'mov eax,[ecx]'指令中,'ecx'的值將被視爲32位地址,但由於進程是64位的,我認爲它可以引用僅限64位內存空間。理論上,這個指令是否應該在64位進程中可執行? – Bliss 2017-06-15 20:41:06
@Bliss,所有的32位寄存器都可以在64位模式下完全訪問。 – 2017-06-15 21:24:34
至於32位寄存器,你當然需要小心,因爲地址將被擴展爲64位,你並不想用32位地址來指代高於4GB標記的地址。儘管如此,使用相對尋址模式很大程度上不會引起關注 – 2017-06-15 21:26:59