简单分页存储管理中若从取指令开始成功执行Mov EAX,0x600(表示从逻辑地址0x600处取数据加载到EAX寄存器),需要访问内存几次?各是哪几次?
时间: 2023-06-10 10:09:03 浏览: 108
在简单分页存储管理中,从逻辑地址0x600处取数据需要访问内存两次。
第一次访问是为了获取页目录表的基地址,CPU通过CR3寄存器获取页目录表的物理地址,并将其缓存到TLB中,这是页表转换的第一级。
第二次访问是为了获取页表的基地址,CPU根据逻辑地址中的目录项索引找到对应的页目录项,读取其中存储的页表基地址,并将其缓存到TLB中,这是页表转换的第二级。
最后,CPU根据逻辑地址中的页内偏移量找到对应的物理地址,并从物理地址中读取数据,将其加载到EAX寄存器中。
相关问题
从取指令开始成功执行mov eax,0x600(表示从逻辑地址0x600处取数据加载到eax寄存器
好的,让我来解释一下这个过程。
首先,计算机执行程序时,需要按照一定的顺序执行指令。这个顺序是由计算机的控制器按照特定的规则来决定的。控制器会从内存中读取指令,然后按照指令的要求执行相应的操作。
在这个过程中,取指令是一个非常重要的步骤。计算机会根据程序计数器(Program Counter)指向的位置从内存中读取指令,然后将程序计数器加上指令的长度,以便下一次取指令时能够正确地指向下一个指令。
在执行mov eax,0x600指令时,计算机会根据程序计数器指向的位置从内存中读取指令。这个指令的含义是将0x600这个内存地址中的数据加载到eax寄存器中。计算机会根据指令中的地址,访问内存并取出数据,然后将数据存放到eax寄存器中。这样,eax寄存器中就存放了0x600这个地址中的数据。
当指令执行完成后,程序计数器会加上指令的长度,以便下一次取指令时能够正确地指向下一个指令。
push %ebp mov %esp,%ebp and $0xfffffff0,%esp sub $0x20,%esp movl movl $0x6,0x10(%esp) movl $0x64,0x14(%esp) mov 0x14(%esp),%eax mov 0x10(%esp),%edx sub %eax,%edx mov %edx,%eax mov %eax,0x18(%esp) mov 0x14(%esp),%eax mov 0x10(%esp),%edx add %edx,%eax mov %eax,0x1c(%esp) mov 0x1c(%esp),%eax mov %eax,0x8(%esp) mov 0x18(%esp),%eax mov %eax,0x4(%esp) movl $0x0,(%esp) call 4f <main+0x4f> leave ret
这是一个汇编语言程序段,可能是一个函数或者整个程序的一部分。以下是对这段程序的逐行解释:
1. push %ebp:将当前函数的基址指针(EBP)压入栈中,为后面的函数操作做准备。
2. mov %esp,%ebp:将当前栈指针(ESP)的值赋给EBP,用于定位参数和局部变量的地址。
3. and $0xfffffff0,%esp:将ESP的值与0xfffffff0进行按位与运算,将ESP向下舍入到最近的16字节边界,用于对齐栈帧。
4. sub $0x20,%esp:为局部变量分配20字节的栈空间。
5. movl:这里缺少操作数,无法确定该行指令的作用。
6. movl $0x6,0x10(%esp):将值0x6存储到ESP+0x10的内存地址中。
7. movl $0x64,0x14(%esp):将值0x64存储到ESP+0x14的内存地址中。
8. mov 0x14(%esp),%eax:将ESP+0x14的内存地址中的值赋给EAX寄存器。
9. mov 0x10(%esp),%edx:将ESP+0x10的内存地址中的值赋给EDX寄存器。
10. sub %eax,%edx:将EAX寄存器中的值减去EDX寄存器中的值,结果存储到EDX寄存器中。
11. mov %edx,%eax:将EDX寄存器中的值赋给EAX寄存器。
12. mov %eax,0x18(%esp):将EAX寄存器中的值存储到ESP+0x18的内存地址中。
13. mov 0x14(%esp),%eax:将ESP+0x14的内存地址中的值赋给EAX寄存器。
14. mov 0x10(%esp),%edx:将ESP+0x10的内存地址中的值赋给EDX寄存器。
15. add %edx,%eax:将EDX寄存器中的值加上EAX寄存器中的值,结果存储到EAX寄存器中。
16. mov %eax,0x1c(%esp):将EAX寄存器中的值存储到ESP+0x1c的内存地址中。
17. mov 0x1c(%esp),%eax:将ESP+0x1c的内存地址中的值赋给EAX寄存器。
18. mov %eax,0x8(%esp):将EAX寄存器中的值存储到ESP+0x8的内存地址中。
19. mov 0x18(%esp),%eax:将ESP+0x18的内存地址中的值赋给EAX寄存器。
20. mov %eax,0x4(%esp):将EAX寄存器中的值存储到ESP+0x4的内存地址中。
21. movl $0x0,(%esp):将值0x0存储到ESP的内存地址中。
22. call 4f <main+0x4f>:调用地址为4f的函数。
23. leave:释放当前函数的栈帧并恢复EBP和ESP的值。
24. ret:从函数返回。
阅读全文