期末考完了……
以下为第二章第一部分的草稿,由于最近要出去一趟可能会比较慢。
在一个章节内讲明白汇编是比较困难的,但是可以将要求放低一点:让读者学会如何阅读、理解汇编代码
《Windows DYI》第二章:IA32体系架构与汇编语言
虽然Windows NT在早期是为多个硬件平台设计的,但是在2000年以前,其所支持的硬件平台只有Intel的IA32架构保留了下来并得到发展,因此目前Windows NT主要支持的硬件平台只有IA32。(ps:在Windows NT 6.x之后,已经支持ARMv7,但是这里不作讨论)
2.1 IA32体系架构
IA32体系结构曾被称作X86,但是X86的概念过于广泛且不够清晰(Intel部分16位产品也属于X86架构)。1985年,随着Intel 80386微处理器的上市,(IA32)被公诸于世。[1]
通常认为,在之后基于IA-32架构的处理器在指令集上保持向前兼容,即仅添加新的指令而不会修改原有的指令。2004年之后推出的IA32E架构是IA32的64位扩展,但是依然保留了对IA32的软件兼容能力。
本文的前半部分仅关注在用户层下的系统编程模型,因此将不会过多地介绍IA-32架构中和系统管理相关的内容,这些内容无法在用户层下实现。
2.1.1寄存器
寄存器(Register),是中央处理器内的其中组成部份。寄存器是有限存贮容量的高速存贮部件,它们可用来暂存指令、数据和地址。在中央处理器的控制部件中,包含的寄存器有指令寄存器(IR)和程序计数器。[2]
在IA32架构的处理器中,寄存器分为下类类型:
1.通用寄存器(EAX、ECX、EDX、EBX、ESP、EBP、ESI、EDI):均为32为长度。“通用”的意思即为这些寄存器可用于缓存数据,打部分的指令也支持操作这些寄存器,但是这些寄存器器都有一些特定的用途。
2.标准寄存器EFLAG:32位长,用于存储各种标志。这个寄存器中的标志由影响这些标志的指令自动设置。
3.指令指针寄存器EIP:32位长,指示下一条将执行的指令在内存中的位置。
4.段寄存器(CS、DS、ES、FS、GS、SS):均为16位长,用于实现段寻址,但是Windows NT使用的是“平坦”内存模型,段机制对于RING3的程序来说不用关心。
5.调试寄存器(DR0-DR7):均为32位长度,用于硬件实现的调试机制。
6.控制寄存器(CR0-CR3):均为32位长度,用于控制CPU的某些行为或其他特定用途,RING3下不需要关心。
7.任务寄存器MSR:均为32位长度,用于控制CPU的某些行为或其他特定用途,同样RING3下不需要关心。
8.用于指示某些表的指针的寄存器(LDTR,GDTR,IDTR):32位长,指示某些和CPU功能相关的表的位置,同样RING3下不需要关心。
可以看出,在用户层下,我们只需要关注8个通用即可,其它寄存器大多无法直接操作甚至是无法直接访问。
IA32架构的处理器中的八个寄存器都可以被拆分为高16位和低16位两部分单独操作,其中前四个(r0-r4)的低16位也可以拆分为两个8位部分单独操作。
寄存器编号 寄存器名 低16位部分别名 低16位部分中高8位别名 低16位部分中低8位别名 定义/特殊用途
r0 EAX AX AH AL 累加器
r1 ECX CX CH CL 循环计数器
r2 EDX DX DH DL 数据拓展寄存器,某些指令将无法在32位长度内储存
的结果存储在EDX中
r3 EBX BX BH BL 基址寄存器,寻址时用于存放基址
r4 ESP SP NA NA 栈指针寄存器,指示栈顶的位置
r5 EBP BP NA NA 栈基指针寄存器
r6 ESI SI NA NA 源索引寄存器,用于字符串操作
r7 EDI DI NA NA 目的索引寄存器,用于字符串操作
2.1.
引用:
1.中文维基百科 IA-32:
http://zh.wikipedia.org/wiki/IA-32
2.中文维基百科 寄存器:
http://zh.wikipedia.org/wiki/%E5%AF%84%E5%AD%98%E5%99%A8