84669 orang belajar
152542 orang belajar
20005 orang belajar
5487 orang belajar
7821 orang belajar
359900 orang belajar
3350 orang belajar
180660 orang belajar
48569 orang belajar
18603 orang belajar
40936 orang belajar
1549 orang belajar
1183 orang belajar
32909 orang belajar
当OD停在入口点,程序一行代码都尚未执行,此时寄存器中的值是如何确定的?eip指向当前地址,esp指向堆栈,那么eax,ebx,ecx中的值是如何来的?
学习是最好的投资!
就x86来说,最主要的用户程序可以控制的通用寄存器并不多,其中最重要的是 eip, esp 分別对应是用户程序的第一条指令和用户程序的堆栈地址,这2个寄存器的os会在载入用户程序的时候根据elf文件的格式设置好。当用户程序运行的时候,其他的通用寄存器eax,ebx,ecx,edx之类的使用是有编译器来管理的,用户程序在使用一个寄存器以前,编译器也会将需要的值先载入到寄存器中。对于cs,ds,es,fs这样的段寄存器,也都是操作系统设置好的。至于cr3这样的控制虚拟内存到物理内存映射表的寄存器,也是os设置好的,用户程序没有权限改变的。
eax, ebx, ecx属于通用寄存器吧, CPU启动时会有默认值(应该是0).
eax
ebx
ecx
操作系统运行一个程序(比方说C语言编译而成的)的方式是:先生成一个新进程,然后运行程序加载器,把堆栈设置好并把程序从磁盘拷贝到内存,然后最后才是把控制权转移给main()函数(其实main()并不是程序内第一个被调用到的函数,但这里为了简化才这么说),之后才是愉快地程序运行。前面执行了那么多代码,总得操作一下寄存器吧…
OS为了加载执行一个程序有多努力你们造吗?OS要创建页表读文件切LDT设寄存器要不然你根本看不见hello world你们造吗? 后台干了所有累活的CPU君在默默地流泪……
就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君在默默地流泪……