6.828学习笔记 Exercise 1

 

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

posted @ 2017-10-29 19:36  zz刚  阅读(376)  评论(0编辑  收藏  举报