.code16 jmp $0, $LABEL_REAL_ENTRY # 段位址會在程序開始處被設置成正確的值 6ed: ea bd 03 00 00 ljmp $0x0,$0x3bd
JMP ptr16:16
ea 查這個表
http://pdos.csail.mit.edu/6.828/2006/readings/i386/appa.htm
-> Jv, Ap, Jb 應該是 Ap。
A : jmp 後面的是位址
p: 32 or 48 bit pointer
ptr16:16 表示這位址由兩個部份組成 segment + offset,
藍色的 00 00 是 segment part, 在真實模式和保護模式有不同的意思, 而程式需要的是真實模式, 所以將這個 segment 改成真實模式下需要的值。
紅色的bd 03是 offset,
L1便是在修改 L3 的藍色部份 (segment), 填入當時的 %ax (載入這個 .com 時, 還在真實模式下的 %ax), 用來返回真實模式。哇! 我到現在才懂 (20130923), 之前看不懂, 只是照抄。
1 movw %ax, (LABEL_GO_BACK_TO_REAL+3) 2 LABEL_GO_BACK_TO_REAL: 3 jmp $0, $LABEL_REAL_ENTRY
這篇的文字很少, 不過金字塔知識門檻很高, 並且還要查閱 intel 手冊才能完成這篇。
沒有留言:
張貼留言
使用 google 的 reCAPTCHA 驗證碼, 總算可以輕鬆留言了。
我實在受不了 spam 了, 又不想讓大家的眼睛花掉, 只好放棄匿名留言。這是沒辦法中的辦法了。留言的朋友需要有 google 帳號。