2017-02-23 165 views
1

我在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上运行这个使用asmfasm命令,这是我的cmd不识别的命令。

我的操作系统:Windows 10

+3

你不*运行*汇编代码。这是一种人类可读的编程语言,汇编程序可以汇编成目标代码,然后将其馈入链接器以生成可执行映像。这就像C代码,它同样不能从命令行*“运行”*。 – IInspectable

+1

这只是你的另一种编程语言的.c文件,你仍然需要组装并链接它。 gnu工具实际上允许你使用c编译器来完成这个工作,你应该可以将它提供给gcc,并且它会理解它是汇编语言而不是C,并且一旦组装完成,就会为你调用链接器,就像它喂食它时一样一个.c文件。理想情况下,链接它为您的目标主机,所以它只是运行。然后你可以例如在汇编语言中修改ascii字符串在a + b中添加更多字符,通过gcc重新运行以查看它实际上是正在使用的这个asm。 –

+0

@old_timer。 'gcc prog.s'生成一个可执行文件。我跑了它,并得到预期的结果。然后我将汇编代码中的'a'从5更改为6,然后再次输入命令。运行修改后的'.exe'并得到'14'。谢谢!我确定这是我的CPU即将运行的机器代码... –

回答

1

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