程序运行前寄存器的值是怎么来的?
当OD停在入口点,程序一行代码都尚未执行,此时寄存器中的值是如何确定的?eip指向当前地址,esp指向堆栈,那么eax,ebx,ecx中的值是如何来的?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
当OD停在入口点,程序一行代码都尚未执行,此时寄存器中的值是如何确定的?eip指向当前地址,esp指向堆栈,那么eax,ebx,ecx中的值是如何来的?
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
接受
或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
发布评论
评论(4)
就x86来说,最主要的用户程序可以控制的通用寄存器并不多,其中最重要的是 eip, esp 分別对应是用户程序的第一条指令和用户程序的堆栈地址,这2个寄存器的os会在载入用户程序的时候根据elf文件的格式设置好。当用户程序运行的时候,其他的通用寄存器eax,ebx,ecx,edx之类的使用是有编译器来管理的,用户程序在使用一个寄存器以前,编译器也会将需要的值先载入到寄存器中。对于cs,ds,es,fs这样的段寄存器,也都是操作系统设置好的。至于cr3这样的控制虚拟内存到物理内存映射表的寄存器,也是os设置好的,用户程序没有权限改变的。
eax
,ebx
,ecx
属于通用寄存器吧, CPU启动时会有默认值(应该是0).操作系统运行一个程序(比方说C语言编译而成的)的方式是:先生成一个新进程,然后运行程序加载器,把堆栈设置好并把程序从磁盘拷贝到内存,然后最后才是把控制权转移给main()函数(其实main()并不是程序内第一个被调用到的函数,但这里为了简化才这么说),之后才是愉快地程序运行。前面执行了那么多代码,总得操作一下寄存器吧…
OS为了加载执行一个程序有多努力你们造吗?OS要创建页表读文件切LDT设寄存器要不然你根本看不见hello world你们造吗?
后台干了所有累活的CPU君在默默地流泪……