首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何将机器代码存储在EXE文件中?

如何将机器代码存储在EXE文件中?
EN

Stack Overflow用户
提问于 2013-01-31 16:45:44
回答 1查看 3.2K关注 0票数 11

我的问题如下:

  1. 可移植可执行格式(在Windows/Unix上)一般如何与x86/x64指令集相关联?
  2. PE格式是否存储处理器支持的确切操作码集,还是操作系统转换的更一般的格式以与CPU匹配?
  3. EXE文件如何指示所需的指令集扩展名(如3 3DNOW!或SSE/MMX?)
  4. 这些操作码在Windows、Mac和unix等所有平台上都是通用的吗?
  5. 英特尔与i386兼容的CPU芯片,比如英特尔和AMD的芯片,使用的是通用指令集。但我相信手臂驱动的CPU会使用不同的操作码。这些是非常不同,还是概念相似?注册,int/浮动/双,SIMD等等?

在较新的平台上,如.NET、Java或Flash,指令集是基于堆栈的操作码,JIT在运行时将其转换为本机格式。由于习惯了这种格式,我想知道“旧”本地EXE格式是如何执行和格式化的。例如,“寄存器”通常在较新的平台操作码中不可用,因为JIT将堆栈命令转换为它认为必要的16/32可用CPU寄存器。但在本机格式中,您需要按索引引用寄存器,并计算哪些寄存器可以重用,以及可重用的频率。

EN

回答 1

Stack Overflow用户

发布于 2013-01-31 17:15:55

PE文件格式(以及非windows机器上的ELF/COFF文件格式)定义了一个出现在文件开头的标题,在这个标题中有一个“Machine”代码。在PE文件中,“Machine”代码为2字节,规范为各种机器定义了一组常量:

代码语言:javascript
运行
复制
0x1d3   Matsushita AM33
0x8664  AMD x64
0x1c0   ARM little endian   
0x1c4   ARMv7 (or higher) Thumb mode only
0xebc   EFI byte code   
0x14c   Intel 386 or later processors and compatible processors 
0x200   Intel Itanium processor family  
0x9041  Mitsubishi M32R little endian   
0x266   MIPS16  
0x366   MIPS with FPU
0x466   MIPS16 with FPU 
0x1f0   Power PC little endian  
0x1f1   Power PC with floating point support    
0x166   MIPS little endian  
0x1a2   Hitachi SH3 
0x1a3   Hitachi SH3 DSP 
0x1a6   Hitachi SH4 
0x1a8   Hitachi SH5     
0x1c2   ARM or Thumb (“interworking”)   
0x169   MIPS little endian WCE v2   

然后,在PE (或ELF)文件中有一个或多个包含(二进制)机器代码的“代码”部分。该代码被加载到内存中,并由CPU直接执行。操作系统或动态链接器/加载程序(它负责实际加载)知道它正在运行的是哪台机器,因此它会检查头中的“machine”代码,以确保它在尝试加载和执行代码之前匹配。如果不匹配,可执行文件将被拒绝,因为它无法运行。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14630852

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档