https://teratail.com/questions/342734で質問したばかりなのですが、
また違う疑問が出たので教えてください。
gccで以下のコードを逆アセンブルしました。
#include <stdio.h> int main(void) { int a,b,c; a = 1; b = 2; c = a + b; printf("c = %d\n",c); return 0; }
.file "test4.c" .text .def ___main; .scl 2; .type 32; .endef .section .rdata,"dr" LC0: .ascii "c = %d\12\0" .text .globl _main .def _main; .scl 2; .type 32; .endef _main: pushl %ebp movl %esp, %ebp andl $-16, %esp subl $32, %esp call ___main movl $1, 28(%esp) movl $2, 24(%esp) movl 28(%esp), %edx movl 24(%esp), %eax addl %edx, %eax movl %eax, 20(%esp) movl 20(%esp), %eax movl %eax, 4(%esp) movl $LC0, (%esp) call _printf movl $0, %eax leave ret .ident "GCC: (i686-posix-dwarf-rev0, Built by MinGW-W64 project) 8.1.0" .def _printf; .scl 2; .type 32; .endef
###分からない事
・.def ___main; .scl 2; .type 32; .endef
と.def _main; .scl 2; .type 32; .endef
、.def _printf; .scl 2; .type 32; .endef
における .defと.scl 、.type .endefは何を表しているのですか?
(値が2と32になっているのは何故ですか?)
・__main
と_main
は何が違うのですか?
・.section .rdata,"dr"
は何を表しているのですか?
・.ident "GCC: (i686-posix-dwarf-rev0, Built by MinGW-W64 project) 8.1.0"
を省略しても正常に動作はするのですが、省略することでシステムに悪影響を及ぼしますか?もし、.ident以下を省略したコードを配布すればライセンス的にはどうなのですか?
・movl $1, 28(%esp)
やmovl $2, 24(%esp)
、movl %eax, 20(%esp)
で値を移動させているときに、アドレス28,24,20に格納していますが、なぜこれらのアドレスに格納されたのですか?確保されたスタックフレームは32なのにも関わらず、なぜ28番地のアドレスから使用しているのでしょうか?
###環境
MinGW
Windows10
なにか間違っていることがあれば、ご指摘ください。
どうかご教授お願いします。
回答1件
あなたの回答
tips
プレビュー