DIY微型操作系统(2)—— 寄存器赋值
书上已经为我们提供了最简单的“hello world”程序了
相信大家玩的也挺欢乐的,不过这只是引导扇区的雏形
而且如果找不到完整的光盘上的源代码,新手估计很难学的下去
所以之后文中也会尽量贴出代码
不过在继续开始之前,我们有另外意见很重要的事情要做:
让所有东西都在掌控之中!
如果你觉得觉得有几个特殊寄存器的值不知道怎么给,那么
接下来我们要看看怎么样随心所欲地给所有寄存器赋值
Intel x86系列寄存器与赋值方式 (存放到内存顺序:低地址对低地址) |
|||
32bit名称 |
16bit名称 |
注释 |
赋值方式 |
EAX |
AX |
accumulator |
|
ECX |
CX |
counter |
|
EDX |
DX |
data |
|
EBX |
BX |
base |
可以用来控制制定内存地址(变址): MOV [SI],AX |
EBP |
BP |
base pointer |
|
ESI |
SI |
source index |
|
EDI |
DI |
destination index |
|
ESP |
SP |
stack pointer |
|
EFLAGS |
FLAGS |
flags |
不可以用MOV直接赋值 |
|
IP |
instruction pointer |
|
|
CS |
code segment |
|
|
DS |
data segment |
不能用MOV赋立即数 但可以通过AX等寄存器赋值 |
|
ES |
extra segment |
|
|
SS |
stack segment |
|
|
FS |
segment part2 |
|
|
GS |
segment part3 |
|
|
GDT |
global description table |
通过LGDT赋值 |
|
LDT |
local description table |
通过LLDT赋值 |
赋值方式补充 |
|
寄存器 |
赋值方式 |
DS,ES,SS,FS,GS |
MOV AX,7C00H MOV DS,AX |
PUSH 和 POP 指令 |
|
IP |
JMP |
CALL |
|
CS:IP |
JMP 0x0001:0x0000 |
CALL |
|
PUSH 和 RET 指令 |
|
(E)FLAGES |
PUSHFD ;push flags double-word POP EAX ... PUSH EAX POPFD ;pop flags double-world |
GDT |
LGDT |
LDT |
LLDT |
一看这些,估计头都有点晕了吧
没关系,也不用一下子就记住,只要用的时候知道上哪里查找就可以了。在以后的开发过程中用着用着就记住了。
那么这次我们就到这里,可以在看书的时候稍微留意一下作者川合先生的代码是怎么赋值的,或许会有不少新收获。
转载本文请保留以下网址:http://www.cnblogs.com/warren-wong/p/3976042.html
如果发现文中有错误之处,请务必告诉我,谢谢大家。