1.The Rom BIOS
计算机启动时物理地址为0x000ffff0,是在64KB的ROM BIOS的顶端。此时CS为0xf000 and IP = 0xfff0。第一条指令为长跳转至CS = 0xf000 and IP = 0xe05b.
0xffff0是BIOS末端(0x100000)前16 Byte的地址。因此需要跳转至BIOS之前的位置。
(指令长度???)
Exercise 2 使用GDB's si (Step Instruction) 命令跟踪更多ROM BIOS指令
1.[f000:fff0] 0xffff0: ljmp $0xf000,$0xe05b 长跳转至BIOS RAM前面的位置
2.[f000:e05b] 0xfe05b: cmpl $0x0,%cs:0x6c48 立即数和寄存器值比较,判断是否为空
3.[f000:e062] 0xfe062: jne 0xfd2e1 jump not equal
4.[f000:e066] 0xfe066: xor %dx,%dx 没有jump,清空dx通用寄存器
5.[f000:e068] 0xfe068: mov %dx,%ss 赋值0给Stack Segment。ss,sp求物理地址的公式是=ss* 16+ sp
6.[f000:e06a] 0xfe06a: mov $0x7000,%esp 将栈顶指针赋值为0x7000。ESP是栈顶指针,EBP是存取堆栈指针
7.[f000:e070] 0xfe070: mov $0xf3691,%edx EAX、ECX、EDX、EBX:为ax,bx,cx,dx的延伸,32bit。dx为其低16bit
8.[f000:e076] 0xfe076: jmp 0xfd165 跳转至0xfd165
9.[f000:d165] 0xfd165: mov %eax,%ecx
10.[f000:d168] 0xfd168: cli 关闭eflags寄存器中的IF标志,屏蔽中断
11.[f000:d169] 0xfd169: cld clear df
12.[f000:d16a] 0xfd16a: mov $0x8f,%eax 将0x8f赋值给寄存器eax
13.[f000:d170] 0xfd170: out %al,$0x70 AX为16bit寄存器AH为高8位,AL为低8位 AX是EAX的低16位。使用in/out来访问系统的io空间,out为从0x70端口地址输出al的值
14.[f000:d172] 0xfd172: in $0x71,%al 读取。端口意义为????
15.[f000:d174] 0xfd174: in $0x92,%al
16.[f000:d176] 0xfd176: or $0x2,%al