読者です 読者をやめる 読者になる 読者になる

だんぷ日記2日目 四則演算編

四則演算編

C言語アセンブラコードを比べてみようってなわけで。

元のコード
ともじさんの「初心者のためのポイント学習C言語」より
第3章 基本的な演算子より。
http://www9.plala.or.jp/sgwr-t/c/S/smpl03-1.html

#include

int main(void)
{
int a=105,b=20,c;
c = a+b;
printf("a + b = %d\n",c);
c = a-b;
printf("a - b = %d\n",c);
c = a*b;
printf("a * b = %d\n",c);
c = a / b;
printf("a / b = %d\n",c);
c = a % b;
printf("a %% b = %d\n",c);

return 0;
}


作ったExeをWinDbgで開いて、

bp main(メイン関数にブレークポイント
gでメイン関数まで進む

アセンブラコード

0:000> u eip eip+100
hello2!main:
00401010 55 push ebp
00401011 8bec mov ebp,esp
00401013 83ec0c sub esp,0Ch
00401016 c745fc69000000 mov dword ptr [ebp-4],69h?
0040101d c745f814000000 mov dword ptr [ebp-8],14h?
00401024 8b45fc mov eax,dword ptr [ebp-4]?
00401027 0345f8 add eax,dword ptr [ebp-8]?
0040102a 8945f4 mov dword ptr [ebp-0Ch],eax?
0040102d 8b4df4 mov ecx,dword ptr [ebp-0Ch]?
00401030 51 push ecx
00401031 6800104200 push offset hello2!__rtc_tzz (hello2+0x21000)
(00421000)
00401036 e89b000000 call hello2!printf (004010d6)
0040103b 83c408 add esp,8
0040103e 8b55fc mov edx,dword ptr [ebp-4]
00401041 2b55f8 sub edx,dword ptr [ebp-8]
00401044 8955f4 mov dword ptr [ebp-0Ch],edx
00401047 8b45f4 mov eax,dword ptr [ebp-0Ch]
0040104a 50 push eax
0040104b 680c104200 push offset hello2!__rtc_tzz (hello2+0x2100c)
(0042100c)
00401050 e881000000 call hello2!printf (004010d6)
00401055 83c408 add esp,8
00401058 8b4dfc mov ecx,dword ptr [ebp-4]
0040105b 0faf4df8 imul ecx,dword ptr [ebp-8]
0040105f 894df4 mov dword ptr [ebp-0Ch],ecx
00401062 8b55f4 mov edx,dword ptr [ebp-0Ch]
00401065 52 push edx
00401066 6818104200 push offset hello2!__rtc_tzz (hello2+0x21018)
(00421018)
0040106b e866000000 call hello2!printf (004010d6)
00401070 83c408 add esp,8
00401073 8b45fc mov eax,dword ptr [ebp-4]
00401076 99 cdq
00401077 f77df8 idiv eax,dword ptr [ebp-8]
0040107a 8945f4 mov dword ptr [ebp-0Ch],eax
0040107d 8b45f4 mov eax,dword ptr [ebp-0Ch]
00401080 50 push eax
00401081 6824104200 push offset hello2!__rtc_tzz (hello2+0x21024)
(00421024)
00401086 e84b000000 call hello2!printf (004010d6)
0040108b 83c408 add esp,8
0040108e 8b45fc mov eax,dword ptr [ebp-4]
00401091 99 cdq
00401092 f77df8 idiv eax,dword ptr [ebp-8]?
00401095 8955f4 mov dword ptr [ebp-0Ch],edx
00401098 8b4df4 mov ecx,dword ptr [ebp-0Ch]
0040109b 51 push ecx
0040109c 6830104200 push offset hello2!__rtc_tzz (hello2+0x21030)
(00421030)
004010a1 e830000000 call hello2!printf (004010d6)
004010a6 83c408 add esp,8
004010a9 33c0 xor eax,eax
004010ab 8be5 mov esp,ebp
004010ad 5d pop ebp
004010ae c3 ret