【问题标题】:How to compile and run assembler source from the command prompt?如何从命令提示符编译和运行汇编源代码?
【发布时间】:2017-07-14 11:54:35
【问题描述】:

我在C 有这个相对简单的程序 打印两个ints的总和:

#include <stdio.h>

int main()
{
    int a = 5;
    int b = 8;
    printf("a + b = %d", a+b);
    getchar();
}

我使用以下命令生成了汇编代码:gcc -S prog.c 以获取汇编代码。

    .file   "prog.c"
    .def    ___main;    .scl    2;  .type   32; .endef
    .section .rdata,"dr"
LC0:
    .ascii "a + b = %d\0"
    .text
    .globl  _main
    .def    _main;  .scl    2;  .type   32; .endef
_main:
LFB10:
    .cfi_startproc
    pushl   %ebp
    .cfi_def_cfa_offset 8
    .cfi_offset 5, -8
    movl    %esp, %ebp
    .cfi_def_cfa_register 5
    andl    $-16, %esp
    subl    $32, %esp
    call    ___main
    movl    $5, 28(%esp)
    movl    $8, 24(%esp)
    movl    28(%esp), %edx
    movl    24(%esp), %eax
    addl    %edx, %eax
    movl    %eax, 4(%esp)
    movl    $LC0, (%esp)
    call    _printf
    call    _getchar
    movl    $0, %eax
    leave
    .cfi_restore 5
    .cfi_def_cfa 4, 4
    ret
    .cfi_endproc
LFE10:
    .ident  "GCC: (GNU) 5.3.0"
    .def    _printf;    .scl    2;  .type   32; .endef
    .def    _getchar;   .scl    2;  .type   32; .endef

如何从命令行运行这个prog.s?所有搜索都导致在 Linux 上使用我的cmd 无法识别的asmfasm 命令运行它。

我的操作系统:Windows 10

【问题讨论】:

  • 你不会“运行”汇编代码。它是一种人类可读的编程语言,汇编器可以将其汇编成目标代码,然后将其输入链接器以生成可执行映像。就像 C 代码一样,同样不能在命令行中"run"
  • 它只是你的另一种编程语言的 .c 文件,你仍然需要组装和链接它。 gnu 工具实际上允许您使用 c 编译器执行此操作,您应该能够将其输入 gcc,它会理解它是汇编语言而不是 C,并且一旦组装,就会像您输入它时那样为您调用链接器.c 文件。理想情况下将它链接到您的目标主机,以便它运行。然后,您可以例如在汇编语言中修改 ascii 字符串,在 a + b 中添加更多字符,重新运行 gcc 以查看正在使用的确实是这个 asm。
  • @old_timer。 gcc prog.s 生成了一个可执行文件。我运行它并得到了预期的结果。然后我将汇编代码中的a 从 5 更改为 6 并再次键入命令。运行修改后的.exe 并得到14。谢谢!我确定这是我的 CPU 即将运行的机器代码......

标签: c windows gcc assembly command-line


【解决方案1】:

它只是您的另一种编程语言的 .c 文件,您仍然需要组装和链接它。 gnu 工具实际上允许您使用 c 编译器执行此操作,您应该能够将其输入 gcc,它会理解它是汇编语言而不是 C,并且一旦组装,就会像您输入它时那样为您调用链接器.c 文件。理想情况下将它链接到您的目标主机,以便它运行。然后,您可以例如在汇编语言中修改 ascii 字符串,在 a + b 中添加更多字符,重新运行 gcc 以查看正在使用的确实是这个 asm。

【讨论】:

    猜你喜欢
    • 2015-10-07
    • 2013-09-25
    • 2010-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多