古典的な 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 コンパイラによって生成されたコードでは見られませんでした。
私は何を誤解しましたか?