###概要
すみません。わからないことが有るので助けてください。
以下のコードを逆アセンブリしました。
#include<stdio.h> #include<math.h> int main(void){ int s = 0; while ((++s) <= 10){ double value = s; if (s % 2 == 1){ continue; } double a; double b; double c; a = 1 / value; b = value * value; c = sqrt(value); printf("%5.1f %5.3f %6.1f %6.4f\n",value,a,b,c); } return 0; }
gcc -S -fno-asynchronous-unwind-tables -fno-ident test.c
.file "test9.c" .text .def ___main; .scl 2; .type 32; .endef .section .rdata,"dr" .align 4 LC1: .ascii "%5.1f %5.3f %6.1f %6.4f\12\0" .text .globl _main .def _main; .scl 2; .type 32; .endef _main: pushl %ebp movl %esp, %ebp andl $-16, %esp subl $96, %esp call ___main movl $0, 92(%esp) jmp L2 L4: fildl 92(%esp) #この「fild命令」とはどういうものなのか。 fstpl 80(%esp) #この「fstep命令」とはどういうものなのか。 movl 92(%esp), %eax cltd shrl $31, %edx #多分(s % 2 == 1)を計算している。 addl %edx, %eax andl $1, %eax subl %edx, %eax cmpl $1, %eax jne L3 jmp L2 L3: fld1 #このコードの意味が分からない。 fdivl 80(%esp) #この時、80(%esp)には何の値が入っているのかわからない。即値の$1がない? fstpl 72(%esp) fldl 80(%esp) fmull 80(%esp) #この時、80(%esp)には何の値が入っているのかわからない。test.cのどの部分にあたるか fstpl 64(%esp) fldl 80(%esp) fstpl (%esp) call _sqrt fstpl 56(%esp) fldl 56(%esp) fstpl 28(%esp) fldl 64(%esp) fstpl 20(%esp) fldl 72(%esp) fstpl 12(%esp) fldl 80(%esp) fstpl 4(%esp) movl $LC1, (%esp) call _printf L2: addl $1, 92(%esp) cmpl $10, 92(%esp) jle L4 movl $0, %eax leave ret .def _sqrt; .scl 2; .type 32; .endef .def _printf; .scl 2; .type 32; .endef
#わからない事
・「fld」や「fstp」、「fild」命令がどのような物なのか分かりません。
・L3の一段目の「fld1」の意味が分かりません。
・「fdiv」や「fmul」は乗除をするための命令だと思われますが、
L3の2行目の80(%esp)
には何の値が入っているのでしょうか。
アセンブリ言語に詳しい方、ご教授して頂ければ、助かります。
回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/07/18 08:53