注意: 本篇的說法可能是錯的。
參考 20120912 補充那段。
first edit: 2012/2/20
gcc asm(".code16gcc\n"); 產生的 16 bit 程式碼。
這行的位址在 16/32 bit 下, 被翻譯成不同的組合語言程式碼。
21 volatile u8 *video_addr = (u8*)0xB8000;
objdump -dS b.o L22
22 11: c7 45 f8 00 80 0b 00 movl $0xb8000,-0x8(%ebp)
objdump -dS b.o(16 bit version) L22
22 16: 67 66 c7 45 f8 00 80 movw $0x8000,-0x8(%di)
由於 16 bit 版本的 pointer 是 16 bit, 所以 b8000 被截成 8000 並使用 movw, 而在 32 bit 的版本, 則完整使用 b8000 且是用 movl 指令。
20120912 補充:
在真實機器驗證 (eeepc 901) 之後, 以下的反組譯可能比較精確。雖然是 16 bit code, 但是可以使用 32 bit address。不需要像 turbo c 使用特殊的 far keyword, 是因為 386 的關係嗎?不知道耶, 現在也找不到 8086 真實機器來測試了。
沒有留言:
張貼留言
使用 google 的 reCAPTCHA 驗證碼, 總算可以輕鬆留言了。
我實在受不了 spam 了, 又不想讓大家的眼睛花掉, 只好放棄匿名留言。這是沒辦法中的辦法了。留言的朋友需要有 google 帳號。