在 DOS 世界里,系统服务是通过中断处理程序(INT 21h)实现的
Win32 API 函数完成参数的有效性检查,然后将所有东西都转换为 Unicode. 之后, Win32 API 函数调用 NTDLL 中对应着所需服务的包装函数. NTOSKRNL 中的每一种系统服务都用一个 Service ID 标识. NTDLL 中的包装函数将所需的系统服务的 Service ID 送入 EAX 寄存器,将指向堆栈帧的指针送入 EDX 寄存器,然后发出 INT 2E 指令. 这条指令将处理器切换至内核模式,并使处理器开始执行中断描述符表(Interrupt Descriptor Table, IDT)中为 INT 2E 指定的处理程序. 这个处理程序是由 Windows NT 的 executive 建立的. INT 2E 的处理程序将参数从用户模式的堆栈拷贝到内核模式的堆栈. 堆栈帧的基址为 EDX 寄存器的值. 由 NT executive 提供的 INT 2E 处理程序在内部被称为 KiSystemService().
在实模式下,最低的 1K 内存保存着一个叫中断向量表(Interrupt Vector Table, IVT)的数据结构.
在保护模式下,中断的处理方式与实模式下的类似. 中断描述符表(Interrupt Descriptor Table, IDT)担起了实模式下 IVT 的重任.
9种寻址方式。
1、立即寻址:指定的操作数紧跟在操作码之后,直接存放在代码段中;
2、寄存器寻址:操作数在CPU的寄存器中,而寄存器的名由指令指出;
3、直接寻址:操作数有效地址(16位或32位)直接包含在指令中;
4、寄存器间接寻址:操作数的偏移地址存放在寄存器中,而操作数存放在存储器中;
5、相对寄存器间接寻址:寄存器内容与位移量之和形成操作数的有效地址;EA=[寄存器]+位移量(合并了“基址寻址”和“变址寻址”)
6、基址加变址寻址:基址寄存器内容与变址寄存器内容之和形成操作数的偏移地址;EA=[基址寄存器]+[变址寄存器]
7、相对基址加变址寻址:基址寄存器内容与变址寄存器内容再加偏移量之和形成操作数的有效地址;EA=[基址寄存器]+[变址寄存器]+偏移量
8、比例变址寻址(32位寻址):变址寄存器内容乘以比例因子再加位移量之和形成操作数的32位有效地址。 EA=[变址寄存器]*比例因子+位移量
9、比例变址加基址寻址(32位寻址):变址寄存器内容乘以比例因子再加上基址寄存器的内容,形成操作数的32位有效地址。即:EA=[变址寄存器]*比例因子+[基址寄存器]
10、带位移的基址加比例变址寻址: EA=[变址寄存器]*比例因子+[基址寄存器]+位移量
阅读(617) | 评论(0) | 转发(0) |