2017-02-23 176 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。