首页  >  问答  >  正文

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

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

PHPzPHPz2764 天前535

全部回复(4)我来回复

  • 黄舟

    黄舟2017-04-17 11:25:28

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

    回复
    0
  • 天蓬老师

    天蓬老师2017-04-17 11:25:28

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

    回复
    0
  • 阿神

    阿神2017-04-17 11:25:28

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

    回复
    0
  • PHPz

    PHPz2017-04-17 11:25:28

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

    回复
    0
  • 取消回复