すみません。困っていることがあるので、助けてください。
興味があったので、以下のC言語をGCCを使って逆アセンブルしました。
test
1#include <stdio.h> 2 3int main(void) 4{ 5 printf("Hello World"); 6 return 0; 7}
$gcc -S -fno-asynchronous-unwind-tables test.c
その結果以下のようなアセンブリが出ました。
.file "test.c" .text .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: pushl %ebp movl %esp, %ebp andl $-16, %esp subl $16, %esp call ___main 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
この時、
pushl %ebp movl %esp, %ebp andl $-16, %esp subl $16, %esp
の部分が何を表しているのか分かりません。pushl %ebp
はebpの値をプッシュしていますが、ebpにはこの時、何の値があるのですか?and命令は論理積をとる命令なのにも関わらず、なぜここで使用されているのでしょうか?またsub命令の第1オペランドの値もよく分かりません。32の時もあります。
多少語彙力に乏しい面もありますが、詳しい方、ご教授頂けないでしょうか。
#環境
Windwos64bit
MinGW
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/06/08 12:02