2013年12月11日 星期三

x86 machine code 初探 (7) - jmp

Orange's 一個作業系統的實現 (p 3-25) 從保護模式回到真實模式的 jmp 指令改寫, 作者用這招從 dos 切到保護模式後再切回到真實模式。厲害!若只看 intel datasheet, 沒看過程式碼, 我自己能想到嗎?

.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 帳號。