[此代碼適用於32位x86 Intel彙編器。此外,請嘗試遵守Xcode 5使用的彙編語法。彙編語言並不是我的特長,我想盡量避免由於我不理解代碼而導致的愚蠢錯誤。]跳轉到x86中的64位值
我想寫一個啓動加載器。我的內核入口點位於0xFFFFFFFF之上(因爲此內核內核文件是以64位模式構建的)。現在,我的彙編代碼下面的代碼段,從我的引導裝載程序的源代碼採取:
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
// startprog(phyaddr, arg)
// Start the program on protected mode where phyaddr is the entry point.
// Passes arg to the program in %eax.
//
_startprog:
push %ebp
mov %esp, %ebp
mov 0xc(%ebp), %eax // argument to program
mov 0x8(%ebp), %ecx // entry offset
mov $0x28, %ebx // segment
push %ebx
push %ecx
// set up %ds and %es
mov $0x20, %ebx
movw %bx, %ds
movw %bx, %es
lret
此代碼是由C調用一個指向內核的入口點和參數指針。問題是,上面的代碼假定入口點的地址適合32位指針。但是,我的內核的入口點不適合32位指針;它佔用了它原生大小指針的所有64位(如果你想知道,我不能簡單地在32位模式下重建我的內核,否則我不會問這個問題)。在32位程序集中跳轉到64位地址的最佳方式是什麼?
謝謝。 (這裏是sources for my kernel和sources for my boot loader,如果需要的話)。
這一切都很好,除了我的內核不支持被調用在我看來,它需要在32位保護模式,因爲它切換到長模式本身。 – wjk
事實證明,我的內核預計將被加載在一個低地址。想想那個,直到你指出來,謝謝! – wjk