日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

C和汇编---while反汇编

發(fā)布時間:2023/12/1 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C和汇编---while反汇编 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

環(huán)境:VC++
C程序:

#include "stdio.h"int main() {int i=1,sum=0;while(i<=100){sum+=i;i++;}printf("%d\n",sum);return 0; }

用while計算1到100的值,功能很簡單,讓我們看看反匯編
首先在main函數(shù)的入口,看到一條匯編不懂意思

0040101C B9 12 00 00 00 mov ecx,12h 00401021 B8 CC CC CC CC mov eax,0CCCCCCCCh 00401026 F3 AB rep stos dword ptr [edi]

查了資料,知道了

  • rep指令:重復stos dword ptr [edi]指令.ECX的值是重復的次數(shù),每次ECX都會減一,到0就不執(zhí)行了
  • stos:將eax中的值拷貝到ES:EDI指向的地址,也就是上面的dword ptr [edi]
  • es:附加段寄存器,存放當前執(zhí)行程序中一個輔助數(shù)據(jù)段的段地址
    我們利用VC++反匯編可以查看一下,當執(zhí)行了一次rep stos dword ptr [edi]命令后

    while的反匯編程序:
5: int i=1,sum=0; 00401028 C7 45 FC 01 00 00 00 mov dword ptr [ebp-4],1 //棧中[ebp-4]的值為1 0040102F C7 45 F8 00 00 00 00 mov dword ptr [ebp-8],0//棧中[ebp-8]的值為0 6: while(i<=100){ 00401036 83 7D FC 64 cmp dword ptr [ebp-4],64h //比較i和100的值 0040103A 7F 14 jg main+40h (00401050) //大于跳轉(zhuǎn)到00401050執(zhí)行 7: sum+=i; 0040103C 8B 45 F8 mov eax,dword ptr [ebp-8] 0040103F 03 45 FC add eax,dword ptr [ebp-4] //相加 00401042 89 45 F8 mov dword ptr [ebp-8],eax //[ebp-8]相當于sum 8: i++; 00401045 8B 4D FC mov ecx,dword ptr [ebp-4] 00401048 83 C1 01 add ecx,1 0040104B 89 4D FC mov dword ptr [ebp-4],ecx 9: } 0040104E EB E6 jmp main+26h (00401036) //執(zhí)行100次之后跳轉(zhuǎn)到00401036執(zhí)行 10: printf("%d\n",sum); 00401050 8B 55 F8 mov edx,dword ptr [ebp-8] 00401053 52 push edx 00401054 68 1C 20 42 00 push offset string "%d" (0042201c) 00401059 E8 32 00 00 00 call printf (00401090) 0040105E 83 C4 08 add esp,8

執(zhí)行一個函數(shù),程序會先把ebp的值壓入棧,把esp賦值給ebp

  • jg:大于跳轉(zhuǎn)指令

反匯編實現(xiàn):

#include "stdio.h"int main() {/*int i=1,sum=0;while(i<=100){sum+=i;i++;}printf("%d\n",sum);*/char *str="sum=%d\n";__asm{mov eax,1mov ebx,0mov ecx,1sum : cmp ecx,100jg endadd ebx,eaxinc eaxinc ecxjmp sumend : push ebxpush strcall printfadd esp,8}return 0;}

總結(jié)

以上是生活随笔為你收集整理的C和汇编---while反汇编的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。