现代微机原理与接口技术 #include stdafx. h' #include <stdio.h> #include <types. h> ∥ types,h,定义了 WORDLONG DWORD,woRD等数据类型 DWORDLONG gdtr savegdt ∥下面是GDT中将创建的数据段描述符表基地址0X00000, ∥段界限为0XFFF优先级为3的在内存中的可写数据段 WORD descriptor= (OXFFFF, OXOFo0, OXF200, 0X0040}; int result[10: int main (int argc, char* argyll) asm push ebp sgdt gdtr ∥将GDTR寄存器的内容读取到 gdr开始的6个字节中,其中 ∥前两个字节给出GDT的界限值, ∥高4个字节给出GDT的基地址 Department of Computer Science Engineering 16 计算机科学与 程系 http://qsyangyeah.net
http://qsyang.yeah.net 现代微机原理与接口技术 16 #include "stdafx.h" #include <stdio.h> #include <wtypes.h> // wtypes.h定义了WORDLONG, //DWORD,WORD等数据类型 DWORDLONG gdtr,savegdt; //下面是GDT中将创建的数据段描述符表,基地址0X00000F00, //段界限为0XFFFF,优先级为3的在内存中的可写数据段 WORD descriptor[4]= {0xFFFF, 0X0F00, 0XF200, 0X0040}; int result[10]; int main(int argc, char* argv[]) {_asm { push ebp sgdt gdtr // 将GDTR寄存器的内容读取到 //gdtr开始的6个字节中,其中 // 前两个字节给出GDT的界限值, //高4个字节给出GDT的基地址
现代微机原理与接口技术 mov ebp, dword ptr igdtr+2]∥将gdt的基 ∥地址读到EBP中 add ebp,70h∥我们选择70H偏移下的段描述 ∥符(GDT中第14个描述符) lea edi, savegdt mov eSl, ebp moved ∥以上4条指令保存原来在70H偏移上 moved ∥的描述符 mov edi, ebp lea esi, descriptor moved ∥把我们的数据段描述符装入70H moved ∥偏移上 push es mov ax,0073h∥/选择字为描述符偏移70H拼接上 ∥1低3位控制位元,其中T为0表 ∥示访问GDT,RPL为11,为3级优 Department of com ns级,所以就为73H 算机科学与工程 http://qsyang.yeah.net
http://qsyang.yeah.net 现代微机原理与接口技术 17 mov ebp,dword ptr [gdtr+2] // 将gdt的基 // 地址读到EBP中 add ebp,70h // 我们选择70H偏移下的段描述 // 符(GDT中第14个描述符) lea edi,savegdt mov esi,ebp movsd // 以上4条指令保存原来在70H偏移上 movsd // 的描述符 mov edi,ebp lea esi,descriptor; movsd // 把我们的数据段描述符装入70H movsd // 偏移上 push es mov ax,0073h // 选择字为描述符偏移70H拼接上 // 低3位控制位元,其中Ti为0,表 // 示访问GDT,RPL为11,为3级优 // 先级,所以就为73H
mov es, ax ∥ES装入选择字73H与续口放米 lea edi result ∥将存放输出结果的变量 ∥的地址放在EDI中 mov eax, mov ebx. 1 asm moy Cx.10 1: mov es: eax , eax add eax. 4 loop al ∥上面4条指令将向物理地址 ∥0X00000F00处写10个双字 asn mov Cx.10 a2: mov eax, es: ebx] mov edil,eax Department of Computer Science Engineering 18 「计算机科学与工程系 http://qsyang.yeah.net
http://qsyang.yeah.net 现代微机原理与接口技术 18 mov es,ax // ES装入选择字73H lea edi,result // 将存放输出结果的变量 //的地址放在EDI中 mov eax,1 mov ebx,1 } _asm { mov cx,10 a1: mov es:[eax],eax add eax,4 loop a1 // 上面4条指令将向物理地址 // 0X00000F00处写10个双字 } _asm { mov cx,10 a2: mov eax,es:[ebx] mov [edi],eax
现代微机原理与接口技术 add ebx. 4 add edi. 4 loop a2 ∥以上从物理地址0X00000F00 ∥处依次读出10个数据存放在 ∥ result数组中 asm op es pop ebp printf result=") for (int=0: k<10: i++) printf("%d,", result[il);∥输出结果 return 0 Department of Computer Science Engineering 19 算机科学与工程系 http://qsyang.yeah.net
http://qsyang.yeah.net 现代微机原理与接口技术 19 add ebx,4 add edi,4 loop a2 // 以上从物理地址0X00000F00 // 处依次读出10个数据存放在 // result数组中 } _asm { pop es pop ebp } printf("result="); for(int i=0;i<10;i++) printf("%d,",result[i]);// 输出结果 return 0; }
现代微机原理与接口技术 10.2.4保护模式下 Pentium4的虚拟页式存储管理 程序1 主存 页面 程序2 页框 程序3 Department of Computer Science Engineering 「计算机科学与工程系 http://qsyang.yeah.net
http://qsyang.yeah.net 现代微机原理与接口技术 20 10.2.4 保护模式下Pentium 4的虚拟页式存储管理 主存 ~ ~ ~ ~ 页框 页面 程序1 程序2 程序3