程序运行前寄存器的值是怎么来的?

发布于 2022-08-29 16:28:33 字数 85 浏览 10 评论 0

当OD停在入口点,程序一行代码都尚未执行,此时寄存器中的值是如何确定的?eip指向当前地址,esp指向堆栈,那么eax,ebx,ecx中的值是如何来的?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

回心转意 2022-09-05 16:28:33

就x86来说,最主要的用户程序可以控制的通用寄存器并不多,其中最重要的是 eip, esp 分別对应是用户程序的第一条指令和用户程序的堆栈地址,这2个寄存器的os会在载入用户程序的时候根据elf文件的格式设置好。当用户程序运行的时候,其他的通用寄存器eax,ebx,ecx,edx之类的使用是有编译器来管理的,用户程序在使用一个寄存器以前,编译器也会将需要的值先载入到寄存器中。对于cs,ds,es,fs这样的段寄存器,也都是操作系统设置好的。至于cr3这样的控制虚拟内存到物理内存映射表的寄存器,也是os设置好的,用户程序没有权限改变的。

网白 2022-09-05 16:28:33

eax, ebx, ecx属于通用寄存器吧, CPU启动时会有默认值(应该是0).

不必了 2022-09-05 16:28:33

操作系统运行一个程序(比方说C语言编译而成的)的方式是:先生成一个新进程,然后运行程序加载器,把堆栈设置好并把程序从磁盘拷贝到内存,然后最后才是把控制权转移给main()函数(其实main()并不是程序内第一个被调用到的函数,但这里为了简化才这么说),之后才是愉快地程序运行。前面执行了那么多代码,总得操作一下寄存器吧…

对风讲故事 2022-09-05 16:28:33

OS为了加载执行一个程序有多努力你们造吗?OS要创建页表读文件切LDT设寄存器要不然你根本看不见hello world你们造吗?
后台干了所有累活的CPU君在默默地流泪……

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文