【问题标题】:Can I directly run compiled code in windows?我可以直接在windows中运行编译的代码吗?
【发布时间】:2021-03-05 19:10:40
【问题描述】:

this站点,写了一段简单的C代码,得到了它的汇编代码:(x86-64 gcc 10.2)

#include<stdio.h>
// Type your code here, or load an example.
int main() {
    int a=5, b=5;
    int c = a+b;
    return 0;
}
main:
        push    rbp
        mov     rbp, rsp
        mov     DWORD PTR [rbp-4], 5
        mov     DWORD PTR [rbp-8], 5
        mov     edx, DWORD PTR [rbp-4]
        mov     eax, DWORD PTR [rbp-8]
        add     eax, edx
        mov     DWORD PTR [rbp-12], eax
        mov     eax, 0
        pop     rbp
        ret

如果我复制上述汇编代码并将其粘贴到记事本中,我能否以某种方式在 Windows 中运行它以获得与运行上述 C 代码相同的预期输出?如果可以,我该怎么做。

【问题讨论】:

  • 你得到的是汇编源代码。通过汇编程序运行它,您将拥有可执行文件。或者,只需在原始 C 代码上使用普通 C 编译器,这也会为您提供可执行文件。
  • CPU 运行二进制机器代码,而不是 asm 文本源。如果您将其组装.obj 并像C 编译器那样链接它,那么可以。

标签: c assembly x86-64


【解决方案1】:

您不能使用记事本等文本编辑器来编写二进制文件,因为文本编辑器通常会删除不代表可打印字符的字节。

您必须使用十六进制编辑器或其他一些用于二进制文件的编辑器。其次,除非您正在编写非常基本的 可执行文件格式 (like the .COM file format for DOS),否则您需要做的不仅仅是为程序的预期入口点编写机器代码。 EXE 和 ELF 可执行文件由标头、重定位、文本、数据、资源等组成,而不仅仅是机器代码。

【讨论】:

  • 此外,您不能使用以ret 结尾的函数作为进程入口点(同样,除非它是 DOS .com,其中入口处的堆栈指针指向将退出过程)。
【解决方案2】:

您需要将其组装成一个目标文件,然后将其与加载程序(如 CRT)链接或按原样作为.com 文件运行(Windows 不支持,这是 DOS 的事情) .

【讨论】:

  • 澄清一下,64位Windows下不支持,32位Windows可以正常运行DOS(NTVDM)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-15
  • 1970-01-01
  • 2012-04-28
相关资源
最近更新 更多