1

古典的な helloworld である C 言語で簡単なプログラムを作成しました。コンパイラがそれをアセンブリ コードに変換したとき、どのように見えるかを知りたかったのです。

MinGW と次のコマンドを使用します。

gcc -S hellow.c

このファイルを開いたとき、少なくとも、アセンブリで直接記述された hello-world プログラムに多少似ていると思いました。つまり、次のとおりです。

jmp 115
db 'Hello world!$' (db = define bytes)
-a 115 
mov ah, 09 (09 for displaying strings ... ah = 'command register')
mov dx, 102 (adress of the string)
int 21
int 20

代わりに、次のようになります。

   .file    "hellow.c"

.def    ___main;    
.scl    2;  
.type   32; 
.endef
.section 
.rdata,"dr"
LC0:

.ascii "Hello world!\0"

.text
.globl  _main

.def    _main;  
.scl    2;  
.type   32; 
.endef
_main:
 LFB6:

.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    $16, %esp
call    ___main
movl    $LC0, (%esp)
call    _puts
movl    $0, %eax
leave

.cfi_restore 5

.cfi_def_cfa 4, 4
ret

.cfi_endproc
LFE6:

.def    _puts;  
.scl    2;  
.type   32; 
.endef

私はアセンブリ言語について少し知っていますが、ADD、POP、PUSH、MOV、JMP、INT などのいわゆるニーモニックを認識しています。これらの多くは、C コンパイラによって生成されたコードでは見られませんでした。

私は何を誤解しましたか?

4

2 に答える 2

3

__mainこれにより、C プログラムに必要なすべての初期設定をおそらく行う関数を呼び出すための引数が準備されます。

andl    $-16, %esp
subl    $16, %esp
call    ___main

これにより、引数が準備され、 function が呼び出されます_putsLC0出力する文字列を含むシンボルです。

movl    $LC0, (%esp)
call    _puts

これにより、戻り値が準備され、戻りmainます

movl    $0, %eax
leave
ret
于 2013-09-12T13:41:18.227 に答える