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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

C代码+汇编 C的 函数汇编学习分析 rep stos dword ptr [edi]

發布時間:2024/4/19 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C代码+汇编 C的 函数汇编学习分析 rep stos dword ptr [edi] 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

如分析有誤,請在評論區中,指出 謝謝合作
主要是分析C的函數調用在匯編中的執行流程

本章主要是說一下函數調用時堆棧的變化,重點理解部分

C代碼

#include"stdafx.h" int plus(int x,int y){return x+y; }int main() { plus(0,1);return 0; }

匯編代碼 VC6.0++ 反編譯所得 (如分析有誤,請在評論區提出,謝謝)

//函數部分 0040100A jmp plus (00401010) //跳轉到 00401010內存位置 0040100F int 3 //無視 00401010 push ebp //ebp壓棧 00401011 mov ebp,esp // esp的值 賦給 ebp 00401013 sub esp,40h //esp = esp-40H //esp寄存器是棧首位置,相當于提升堆棧,開辟 00401016 push ebx //壓棧 00401017 push esi //壓棧 00401018 push edi //壓棧 00401019 lea edi,[ebp-40h] //將ebp的內存地址 - 40H 后所得的內存地址 賦值給 edi寄存器 0040101C mov ecx,10h 將 10H (16) 賦給 ecx寄存器 00401021 mov eax,0CCCCCCCCh 將 ,0CCCCCCCCh 賦值給eax 00401026 rep stos dword ptr [edi] //循環 ecx的次數 00401028 mov eax,dword ptr [ebp+8] //將ebp+8的內存地址的值 賦給 eax 0040102B add eax,dword ptr [ebp+0Ch] // eax = eax + (ebp+0Ch)的值 0040102E pop edi //彈出棧 0040102F pop esi //彈出棧 00401030 pop ebx //彈出棧 00401031 mov esp,ebp //恢復堆棧 00401033 pop ebp //彈出棧底 00401034 ret //相當于 pop eip//main函數部分 0040B76E push 1 //壓棧 因為C函數的調用約定 '__stdcall', plus(0,1); 參數從右向左壓入堆棧 0040B770 push 0 //壓棧 0040B772 call @ILT+5(plus) (0040100a) 0040B777 add esp,8

一步一步來,這里的話 需要畫圖哈.別急

前置條件:

堆棧的特點是 前大后小(內存地址) 本章是 32位寄存器 所以一次性 4
main函數中, (棧首)esp的寄存器的值為 0019FEF4 , (棧尾)ebp的寄存器的值為 0019FF40
自繪圖

匯編圖

代碼邏輯執行開始,主要是堆棧的變

------1

0040B76E push 1 //壓棧 因為C函數的調用約定 '__stdcall', plus(0,1); 參數從右向左壓入堆棧 0040B770 push 0 //壓棧 0040B772 call @ILT+5(plus) (0040100a)0040B777 0040B777 add esp,8

push壓棧時: 修改的 esp(棧頂的值) -4
執行前三句:結果如圖
前兩句應該很好理解
call指令,在指令執行的時候,會把call的內存地址 下一行的內存地址 壓入堆棧中

--------2

0040100A jmp plus (00401010) //跳轉到 00401010內存位置 0040100F int 3 //無視 00401010 push ebp //ebp壓棧

第一行跳轉,不用多說
第二行無視
第三行: push ebp//將堆棧的底,壓入到內存地址

00401011 mov ebp,esp 00401013 sub esp,40h // 40h = 64(十進制)

第一句 ebp = esp,含義為 執行這個函數開辟內存

第二局 esp的內存地址 減去40H = 19FEA4? 個人見解:提升堆棧 40H=64(十進制) 因為32寄存器 堆棧為4 所以就是提升 64/4= 16

00401016 push ebx //壓棧 00401017 push esi //壓棧 00401018 push edi //壓棧 00401019 lea edi,[ebp-40h] //將ebp的內存地址 - 40H 后所得的內存地址 賦值給 edi寄存器

前三句沒什么好說的
就是壓棧

lea edi,[ebp-40h] //這句話就有點意思了。 ebp-40H就是剛才 esp-40H的地址一樣的,將值賦值給EDI

高能從這里開始 就比較有意思了

0040101C mov ecx,10h //重復次數 00401021 mov eax,0CCCCCCCCh //eax = 0XCCCCCCCC 00401026 rep stos dword ptr [edi] //

第一句 ecx寄存器一般用來計數, 10H = 16(十進制) 跟我們剛才 ESP-40H 的內存地址也是16個
第二句 將0CCCCCCCCh 賦值給EAX寄存器
第三句 rep stos 【repeat(重復) store(保存) string】
指令解析

rep 重復前綴指令,英文縮寫 repeat,每執行一次, ecx 減 1,直到 ecx 減至0,重復執行結束

stos 串存儲指令,英文縮寫 store string ,將 eax 中的數據傳送到目的地址(目的地址默認edi寄存器),
以下兩條指令相當于一條 stos 指令

mov [edi], eaxadd edi, 4 ;或者 sub edi, 4 // 至于到底是加 4 還是減 4 ,是由方向標志 DF 來決定,可以由指令 cld 和 std 指令設置 cld: 從低地址往高地址傳送 std: 從高地址往低地址傳送

首次執行的匯編圖

10H = 16(十進制) 所以rep就是執行16次,所得結果如圖
匯編圖:
自繪圖

00401028 mov eax,dword ptr [ebp+8] 0040102B add eax,dword ptr [ebp+0Ch]

自繪圖可以明顯看到 ebp+8 與 ebp+0ch 也就是函數傳參的兩個值
也就是C代碼 x+y;

0040102E pop edi //彈出棧 0040102F pop esi //彈出棧 00401030 pop ebx //彈出棧

這三句都是出棧, 注意出棧后esp的棧頂指針會+4
這三句的自繪圖,這時esp的棧頂指針的內存地址為 19FEA4

這三句是本章重點

00401031 mov esp,ebp 00401033 pop ebp 00401034 ret

自繪圖,這三句執行前的堆棧圖

mov esp,ebp

當執行 的時候,堆棧的 棧頂與棧尾在同一個位置

00401033 pop ebp

因為執行pop 所以 esp的棧頂指針(0019FEE4)+4 = (0019FEE8)
因為 pop彈出的是堆棧 所以 ebp的值會回到 上一次的位置 也就是 0019FF40(有疑問請看第一張自繪圖,這里比較難理解,多看幾遍,建議手畫一畫圖)

ret //pop eip

ret指令用棧中的數據,修改偏移地址,從而實現近轉移 就相當于 pop eip
所以ESP棧頂指針(0019FEE8) +4 = (0019FEEC),這時的堆棧圖

0040B777 add esp,8

//esp (0019FEEC)+8 = 0019 FEF4?
這句就是函數的堆棧平衡,也就是操作數據時,開辟堆棧內存.用完了以后又恢復到 調用函數之前的位置:
最后的自繪圖

總結:

1.調用函數的時候,堆棧會為函數執行開辟內存,

00401011 mov ebp,esp 00401013 sub esp,40h

2.調用函數時 用的是Call指令,并且會開辟空間,把函數的參數壓棧,并且把后一個eip地址也壓棧
特點:
1.會先將ebp棧底指針壓棧,還有一些寄存器 首要特點push ebp ,mov ebp,esp
2.Call函數后面的那一句 一般是堆棧平衡的代碼

//mai部分 0040B76E push 1 0040B770 push 0 0040B772 call @ILT+5(plus) (0040100a) //函數部分 00401010 push ebp 00401011 mov ebp,esp 00401013 sub esp,40h 00401016 push ebx 00401017 push esi 00401018 push edi 00401019 lea edi,[ebp-40h]

整理不易,花了好幾個小時,有任何問題請在評論區指出,喜歡的話,點個關注或者喜歡哈

總結

以上是生活随笔為你收集整理的C代码+汇编 C的 函数汇编学习分析 rep stos dword ptr [edi]的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 黄色电影在线视频 | 国产精品成人va在线观看 | 三级不卡 | www.视频一区 | 欧美三级免费观看 | 欧美日韩亚洲一区二区三区 | av片在线观看 | 亚洲国产精品久久久久久久 | 精品一区二区三区视频在线观看 | 久久精品屋| 午夜福利视频合集1000 | 久久人人爽人人 | 欧美高清hd19| 国产高清一 | 亚洲天堂免费在线 | 高清一区二区三区四区 | 我们的生活第五季在线观看免费 | 久久久经典 | 国产一区二区在线免费观看视频 | 中文字幕五码 | 男男一级淫片免费播放 | 亚洲v国产v | 美女尻逼视频 | 国产免费的av | 亚洲最新中文字幕 | 后入内射欧美99二区视频 | 亚洲天堂视频网 | 日韩和欧美一区二区 | 人成在线| 精品午夜视频 | 久久爱影视 | 亚洲黄色网络 | 亚洲第一页夜 | 精品爱爱 | 亚洲天堂福利视频 | 欧洲精品久久久久毛片完整版 | 亚洲天堂视频在线观看 | 日韩高清免费观看 | 色综合天天综合网天天狠天天 | 成人免费观看视频网站 | 精品无码久久久久成人漫画 | 在线免费观看黄色网址 | 91精品国产91久久久久久吃药 | 日本aa视频| 欧洲视频在线观看 | 日本一区不卡 | 亚洲激情欧美色图 | 欧美伦理一区 | 久久久久无码精品国产sm果冻 | 国产精品国产三级国产专区51区 | 黄色一级片在线看 | 欧美人妖另类 | 69毛片| 欧美午夜精品一区二区三区电影 | 97综合视频 | 国产男男chinese网站 | 国产又爽又黄的激情精品视频 | 欧美a网站 | 国产鲁鲁视频在线观看免费 | 国产欧美视频在线播放 | 亚洲国产成人精品久久 | 国产欧美日本在线 | av手机 | 久久久久爱 | 日韩欧美亚洲综合 | va婷婷在线免费观看 | 99热久久这里只有精品 | 91在线无精精品一区二区 | 少妇高潮惨叫久久久久 | 免费在线黄色av | 色多多导航 | 日韩欧美有码 | 精品久久久久久亚洲 | 四虎网站最新网址 | 成人精品黄段子 | 精品一区二区三区四区 | 羞羞网站在线观看 | 521av在线 | 久色综| 中文在线a∨在线 | 美女免费网站 | 国产永久av | 午夜三区 | 中文字幕成人网 | 亚洲一区二区视频网站 | 28一20岁女人一级 | av网站在线播放 | 日本二区视频 | 麻豆传媒在线观看视频 | 欧美视频一二三区 | 精品国产免费无码久久久 | 毛片1000部免费看 | 波多野吉衣毛片 | aaaa级片 | 手机在线免费av | 免费日韩在线视频 | 日本亚洲欧美 | 国产自产在线视频 | 日韩免费av网站 |