您好、欢迎来到现金彩票网!
当前位置:秒速飞艇开奖 > 特权指令 >

请问在VC里编写出来的WIN32控制台程序运行的时候是按16位模式的

发布时间:2019-07-09 21:12 来源:未知 编辑:admin

  请问在VC里编写出来的WIN32控制台程序运行的时候是按16位模式的还是32位的?

  请问在VC里编写出来的WIN32控制台程序运行的时候是按16位模式的还是32位的?

  提问可能说的不太清楚。首先前提是我知道CPU分16位实模式,32位保护模式,和16位的虚拟86模式。开机进入window前汇编指令是按16位实模式执行的,window中是32位保护模式执行,cmd打开...

  提问可能说的不太清楚。首先前提是我知道CPU分16位实模式,32位保护模式,和16位的虚拟86模式。开机进入window前汇编指令是按16位实模式执行的,window中是32位保护模式执行,cmd打开DOS窗口后,里面是按16位虚拟86模式执行的。我试过把一个用32位汇编(就是代码里有eax,ebx之类的)编译出来的EXE,放在cmd打开的DOS窗口中执行,跟踪它结果发现它把我每条32位的指令拆成16位的指令执行了(结果当然是跟代码原意不太相同了),那我就认为虚拟86模式是16位的了。但是我记得以前用VC编译出来的控制台程序,是32位的啊?反汇编好像是有eax这些东西的啊?那我就纳闷了,这种编译出来的类似DOS程序的控制台程序,放在虚拟86模式下,就是在DOS窗口下用DOS命令执行它,为什么又能得到正确的执行?

  可选中1个或多个下面的关键词,搜索相关资料。也可直接点“搜索资料”搜索整个问题。

  展开全部这个是因为EXE文件的特殊结构,32位的EXE文件(或者叫PE文件)相当于在16位EXE文件的基础上附加一个overlay用以容纳32位指令。因此32bit的EXE文件无论在纯DOS还是在WINDOWS下都是可执行的。只不过在纯DOS下的没有进入实际的程序逻辑,而只是用于显示一句“this program can not be run in dos mode”更多追问追答追问你好,感谢你的回答。由于坑爹的百度追问居然还限制字数(最讨厌的是还不告诉你限多少),我把向你追问的内容写到上面的补充上了。追答我感觉这只是一个调试器的问题,debug本身是一个16bit应用程序,自然不可能正常解析32bit应用程序,用debug调试自然会吧程序强行带到16模式下去

  另:感觉你对windows还不怎么了解。虚拟86是9x年代的东西了,在现在的系统中DOS是一个名叫NTVDM的虚拟机,你运行16bit应用程序的时候会自动调用。用CMD打开的并不是dos,而是纯32bit的控制台。追问看补充……追答1、虚拟86早就废弃的东西。NTVDM是保护模式下用户空间运行的虚拟机,和VM、VPC什么的没区别的。废弃的原因是这种混合模式保护不力,这也正是9x内核成天蓝屏的原因。9x下MS-DOS实际就是虚拟86实现的。当然这种模式在最新的CPU上也存在,只不过后面的内核都不再使用罢了

  2、实模式下貌似确实可以用32bit寄存器,MBR中的指令好像有用32bit寄存器的。这个和DOS没什么关系(其实DOS就是个简陋的LAUNCHER而已,程序装入内存以后就没他什么事了),具体估计得查intel的手册,不过这样用的人比较少就是了(可能是处于兼容性考虑)。另外即使可以用32bit寄存器,但实模式下寻址的方式并没有改变,所以最大寻址空间仍然是1MB追问但是……百度百科是这么说的呀:“NTVDM 通过使用 x86 CPU 的虚拟 8086 模式,使得16位程序能够在一定权限范围内正常运行,除非它们试图直接访问硬件……”

  哦 这么快就被通过了审核,厉害啊……但是,NTVDM如果完全是个模拟器,这就说不通了:某些中断如 int 9 ,int 16 ,int 13等或in,out等端口操作指令,或修改中断向量表某些中断的地址(如int 9)等操作不能被执行,“中断被屏蔽或转为windows的异常处理了,保护模式下有自己的中断模式”,

  此外,你贴出来的图片看不出任何问题,提示的是无法识别的指令。若是v86,遇到危险的特权指令时,管理器是直接忽略处理的,更不可能弹什么对话框来追问NTVDM如果完全是个模拟器,那么我的汇编程序在实模式下运行的结果和cmd下的应该是一样的,但是我试过有些汇编程序的EXE在cmd下运行得不到期望的结果(比如使用了int 9)。

  还有,估计XP和win7的cmd是不一样的。估计虚拟86至少在XP上还存在。如:PC机的主板上ROM中写着的那个生产日期,win7的cmd是可以修改的,但在XP的cmd是改不了的(刚就试过改不了,我的XP系统)。亲虚拟机还涉及到一个仿真程度的问题的,MS自己出的玩意改改int 9的实现很难么?就算是实机改日期用的端口都不一定相同。真的不想再回答你了,纯浪费时间。遇到问题多思考多尝试多看文档不然没法提高的。把你问问题那股劲拿来求证你的问题早解决了,你想知道怎么实现的可以,写个程序把控制寄存器的值全读出来不就知道了?好吧,谢谢你了。我就是个喜欢打破沙锅问到底的人,程序员最怕对问题了解得不透切,不过算了。而且程序员的学习资料通常都很匮乏,我的学习通常是按 学习系统讲解知识点的书籍 -》如没有,就在网上找寻零星的资料(别人的帖子,文章) -》 再没有多少资料,最后才是上来问人的(百度知道,CSDN),所以问你是最后的办法了。不过,谢谢你一直的耐心,耐性,分还是会在原来基础上再加给你的!

  32 首先前提是我知道CPU分16位实模式,32位保护模式,和16位的虚拟86模式。开机进入window前汇编指令是按16位实模式执行的,window中是32位保护模式执行,cmd打开DOS窗口后,里面是按16位虚拟86模式

  32位CPU执行被编译的16位汇编,CPU寄存器是线应用程序和控制台应用程序有什么区别

http://mille-alliances.com/tequanzhiling/482.html
锟斤拷锟斤拷锟斤拷QQ微锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷微锟斤拷
关于我们|联系我们|版权声明|网站地图|
Copyright © 2002-2019 现金彩票 版权所有