DB
: define byteRESB
: reserve byteDW
: define word / 16 bitDD
: define double-word / 32 bit$
: 现在的字节数 / 将要读入的内存地址ORG
: origin, 在开始执行的时候,把这些机器语言指令装载到内存中的哪个地址。JMP
: jump, gotoentry:
: 标签的声明,用于指定JMP指令的跳转目的地等。MOV
: move, “MOV AX,0”,相当于“AX=0; ”寄存器
段寄存器
寄存器指定内存地址[]: BX、BP、SI、DI
AX、CX、DX、SP不能用来指定内存地址
JE
: jump if equal
INT
: 是软件中断指令
HLT
: interrupt 是让CPU停止动作的指令, 是让CPU进入待机状态
JC
: 是“jump ifcarry”的缩写,意思是如果进位标志(carry flag)是1的话,就跳转。
JNC
: Jump ifnot carry”
JAE
: “Jump if above or equal”
JBE
: jump if below orequal
image
综上所述,1张软盘有80个柱面,2个磁头,18个扇区,且一个扇区有512字节。所以,一张软盘的容量是:
以ES:BX这种方式来表示地址,写成
MOV AL,[ES:BX]
它代表
ES×16+BX
❏ 首先,使用cc1.exe从bootpack.c生成bootpack.gas。 ❏ 第二步,使用gas2nask.exe从bootpack.gas生成bootpack.nas。 ❏ 第三步,使用nask.exe从bootpack.nas生成bootpack.obj。 ❏ 第四步,使用obi2bim.exe从bootpack.obj生成bootpack.bim。 ❏ 最后,使用bim2hrb.exe从bootpack.bim生成bootpack.hrb。 ❏ 这样就做成了机器语言,再使用copy指令将asmhead.bin与bootpack.hrb单纯结合到起来,就成了haribote.sys。
8086
→80186
→286(16 bit)
→386(32 bit)
→486
→Pentium
→PentiumPro
→PentiumII
→PentiumIII
→Pentium4→
…
GDT
是“global(segment)descriptor table”的缩写,意思是全局段号记录表。将这些数据整齐地排列在内存的某个地方,然后将内存的起始地址和有效设定个数放在CPU内被称作GDTR(global(segment)descriptor table register)的特殊寄存器中,设定就完成了。
另外,IDT
是“interrupt descriptor table”的缩写,直译过来就是“中断记录表”。当CPU遇到外部状况变化,或者是内部偶然发生某些错误时,会临时切换过去处理这种突发事件。这就是中断功能。
将合计4GB[插图]的内存分成很多块(block),每一块的起始地址都看作0来处理。
像这样分割出来的块,就称为 段(segment)
。
按这种分段方法,为了表示一个段,需要有以下信息。
❏ 段的大小是多少 ❏ 段的起始地址在哪里 ❏ 段的管理属性(禁止写入,禁止执行,系统专用等)
顺便说一句,如果不用分段而用分页,也能解决问题。不过我们目前还不讨论分页,可以暂时不考虑它。需要注意的一点是,我们用16位的时候曾经讲解过的段寄存器。这里的分段,使用的就是这个段寄存器。但是16位的时候,如果计算地址,只要将地址乘以16就可以了。
“系统专用”,“应用程序用”什么的,听着让人摸不着头脑。都是些什么东西呀?
在32位模式下,CPU有系统模式(也称为“ring0”[插图])和应用模式(也称为“ring3”)之分。操作系统等“管理用”的程序,和应用程序等“被管理”的程序,运行时的模式是不同的。
PIC
: “programmable interrupt controller”的缩写,意思是“可编程中断控制器”。
IRQ
: PIC是将8个中断信号(interrupt request)集合成一个中断信号的装置。
ICW
: 是“initial control word”的缩写,意为“初始化控制数据”。
IMR
: 是“interrupt maskregister”的缩写,意思是“中断屏蔽寄存器”。
image
现在简单介绍一下PIC的寄存器。首先,它们都是8位寄存器。IMR是“interrupt maskregister”的缩写,意思是“中断屏蔽寄存器”。
/* int.c */
struct KEYBUF {
unsigned char data[32]; // buffer
int next_r; // read
int next_w; // write
int len; // <= 32
};