以下のC言語をアセンブリプログラムとオブジェクトプログラムから逆アセンブルしました。
/* hoge.c */ int func(int n) { int a = 2; int b = 3; int ret; if(n == 0){ ret = a + b; }else{ ret = a * b; } return ret; }
こちらがアセンブリプログラムです。
.text .globl _func .def _func; .scl 2; .type 32; .endef _func: LFB0: .cfi_startproc pushl %ebp # .cfi_def_cfa_offset 8 .cfi_offset 5, -8 movl %esp, %ebp #, .cfi_def_cfa_register 5 subl $16, %esp #, movl $2, -8(%ebp) #, a movl $3, -12(%ebp) #, b cmpl $0, 8(%ebp) #, n jne L2 #, movl -8(%ebp), %edx # a, tmp93 movl -12(%ebp), %eax # b, tmp94 addl %edx, %eax # tmp93, tmp92 movl %eax, -4(%ebp) # tmp92, ret jmp L3 # L2: movl -8(%ebp), %eax # a, tmp96 imull -12(%ebp), %eax # b, tmp95 movl %eax, -4(%ebp) # tmp95, ret L3: movl -4(%ebp), %eax # ret, _7 leave .cfi_restore 5 .cfi_def_cfa 4, 4 ret .cfi_endproc LFE0: .ident "GCC: (MinGW.org GCC-6.3.0-1) 6.3.0"
こちらが逆アセンブルしたプログラムです。
Disassembly of section .text: 00000000 <_func>: 0: 55 push %ebp 1: 89 e5 mov %esp,%ebp 3: 83 ec 10 sub $0x10,%esp 6: c7 45 f8 02 00 00 00 movl $0x2,-0x8(%ebp) d: c7 45 f4 03 00 00 00 movl $0x3,-0xc(%ebp) 14: 83 7d 08 00 cmpl $0x0,0x8(%ebp) 18: 75 0d jne 27 <_func+0x27> 1a: 8b 55 f8 mov -0x8(%ebp),%edx 1d: 8b 45 f4 mov -0xc(%ebp),%eax 20: 01 d0 add %edx,%eax 22: 89 45 fc mov %eax,-0x4(%ebp) 25: eb 0a jmp 31 <_func+0x31> 27: 8b 45 f8 mov -0x8(%ebp),%eax 2a: 0f af 45 f4 imul -0xc(%ebp),%eax 2e: 89 45 fc mov %eax,-0x4(%ebp) 31: 8b 45 fc mov -0x4(%ebp),%eax 34: c9 leave 35: c3 ret 36: 90 nop 37: 90 nop
あの扱う値は同じなのにmovlの部分が逆アセンブリではmovになっていたりしますが、これはどちらのアセンブリプログラムが正しいというかちゃんとコードとして良いものなのでしょうか?
movlは4バイトの値を扱う際の命令ですが、逆アセンブリではmovとなっています。データや数値の扱いなどでバイトやbitは正確な方が良いと思うのでどうかと思うのですが。
あるいは逆アセンブリのほうの最初で
6: c7 45 f8 02 00 00 00 movl $0x2,-0x8(%ebp) d: c7 45 f4 03 00 00 00 movl $0x3,-0xc(%ebp)
と数値$0x2と$0x3を4バイトとして扱うよとmovlで各レジスタへコピーしたため、今後のレジスタでも4バイトとして扱われるためわざわざmovlとは書かず、mov命令となっているのかなと素人の私なりに考えてみましたが実際はどうなのかいまいちわかりません。
なぜ逆アセンブルすると変わるのでしょうか?またどっちのアセンブリソースのほうが良い?というか正確なものなのでしょうか?
どうかよろしくお願いいたします。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/03/08 10:32
2018/03/08 11:13
2018/03/08 11:21
2018/03/08 11:32