c++ - 程序运行前寄存器的值是怎么来的?
PHPz
PHPz 2017-04-17 11:23:28
0
4
560

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

PHPz
PHPz

学习是最好的投资!

全員に返信(4)
黄舟

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

いいねを押す +0
Peter_Zhu

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

いいねを押す +0
阿神

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

いいねを押す +0
PHPzhong

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

いいねを押す +0
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート