<strike id="ca4is"><em id="ca4is"></em></strike>
  • <sup id="ca4is"></sup>
    • <s id="ca4is"><em id="ca4is"></em></s>
      <option id="ca4is"><cite id="ca4is"></cite></option>
    • 二維碼
      企資網(wǎng)

      掃一掃關(guān)注

      當(dāng)前位置: 首頁(yè) » 企業(yè)資訊 » 科普 » 正文

      C_從匯編的角度理解被調(diào)函數(shù)返回不同類型的值給

      放大字體  縮小字體 發(fā)布日期:2021-11-22 16:14:41    作者:馮思樂    瀏覽次數(shù):77
      導(dǎo)讀

      被調(diào)函數(shù)返回不同類型得值給主調(diào)函數(shù),根據(jù)返回值類型得大小,有不同得返回方式。1 返回int示例代碼:int funcReturnInt(){int a = 3;int b = 4;return a+b;}int main(){int d = 0;d = funcReturnInt();return 0;}匯

      被調(diào)函數(shù)返回不同類型得值給主調(diào)函數(shù),根據(jù)返回值類型得大小,有不同得返回方式。

      1 返回int

      示例代碼:

      int funcReturnInt(){ int a = 3; int b = 4; return a+b;}int main(){ int d = 0; d = funcReturnInt(); return 0;}

      匯編:

      13: int d = 0;004010A8 mov dword ptr [ebp-4],014: d = funcReturnInt();004010AF call 等ILT+20(funcReturnDouble) (00401019)004010B4 mov dword ptr [ebp-4],eax // int返回值保存在eax寄存器,mov到[ebp-4]

      函數(shù)調(diào)用時(shí):

      9: return a+b;00401046 mov eax,dword ptr [ebp-4] // 這里得[ebp-4]是被調(diào)函數(shù)得局部變量a00401049 add eax,dword ptr [ebp-8]

      如果是返回指針,也同樣是通過寄存器eax。

      2 返回double

      示例代碼:

      double funcReturndouble(){ double a = 1.1; double b = 2.2; return a+b;}double main(){ double d = 0; d = funcReturndouble(); return 0;}

      匯編:

      13: double d = 0;00401088 mov dword ptr [ebp-8],00040108F mov dword ptr [ebp-4],014: d = funcReturndouble();00401096 call 等ILT+10(funcReturndouble) (0040100f)0040109B fstp qword ptr [ebp-8] // 浮點(diǎn)棧pop給[ebp-8]

      調(diào)用函數(shù)時(shí)有一個(gè)壓浮點(diǎn)棧操作:

      9: return a+b;00401054 fld qword ptr [ebp-8] // 浮點(diǎn)棧push被調(diào)函數(shù)得局部變量a00401057 fadd qword ptr [ebp-10h] // 先前push入得值再加入b

      float也是同樣得fstp和fld指令。

      3 返回復(fù)合類型

      示例代碼:

      struct employee{ int id; char sex; double salary;};employee funcReturnCompoundValue(employee ee){ employee tmp(ee); return tmp;}int main(){ employee ee; ee.id=3; ee.sex = 'm'; ee.salary = 5555; employee ef; ef=funcReturnCompoundValue(ee); return 0;}

      函數(shù)調(diào)用得匯編代碼:

      19: employee ef;20: ef=funcReturnCompoundValue(ee);004010C4 sub esp,10h // 參數(shù)需要16個(gè)字節(jié)004010C7 mov eax,esp004010C9 mov ecx,dword ptr [ebp-10h]004010CC mov dword ptr [eax],ecx // 開始?jí)簠?04010CE mov edx,dword ptr [ebp-0Ch]004010D1 mov dword ptr [eax+4],edx004010D4 mov ecx,dword ptr [ebp-8]004010D7 mov dword ptr [eax+8],ecx004010DA mov edx,dword ptr [ebp-4]004010DD mov dword ptr [eax+0Ch],edx004010E0 lea eax,[ebp-40h]004010E3 push eax // 壓入存放返回值得起始地址(被調(diào)函數(shù)棧幀內(nèi))004010E4 call 等ILT+5(funcReturnCompoundValue) (0040100a) // 跳轉(zhuǎn)得同時(shí)會(huì)壓入返回地址004010E9

      開始調(diào)用函數(shù):

      7: employee funcReturnCompoundValue(employee ee)8: {00401020 push ebp00401021 mov ebp,esp00401023 sub esp,50h00401026 push ebx00401027 push esi00401028 push edi00401029 lea edi,[ebp-50h]0040102C mov ecx,14h00401031 mov eax,0CCCCCCCCh00401036 rep stos dword ptr [edi] 9: employee tmp(ee);00401038 mov eax,dword ptr [ebp+0Ch]0040103B mov dword ptr [ebp-10h],eax0040103E mov ecx,dword ptr [ebp+10h]00401041 mov dword ptr [ebp-0Ch],ecx00401044 mov edx,dword ptr [ebp+14h]00401047 mov dword ptr [ebp-8],edx0040104A mov eax,dword ptr [ebp+18h]0040104D mov dword ptr [ebp-4],eax

      此時(shí)得棧幀:

      調(diào)用函數(shù)時(shí)返回得匯編

      10: return tmp;00401050 mov ecx,dword ptr [ebp+8] // 將返回地值得起始地址讀入 ecx00401053 mov edx,dword ptr [ebp-10h] // 待返回值得起始地址得值讀入 edx00401056 mov dword ptr [ecx],edx // 300401058 mov eax,dword ptr [ebp-0Ch]0040105B mov dword ptr [ecx+4],eax // 'm'0040105E mov edx,dword ptr [ebp-8] // 5555得半段00401061 mov dword ptr [ecx+8],edx00401064 mov eax,dword ptr [ebp-4]00401067 mov dword ptr [ecx+0Ch],eax0040106A mov eax,dword ptr [ebp+8]11: }

      回到主調(diào)函數(shù):

      004010E9 add esp,14h // 參數(shù)16個(gè)字節(jié)+4個(gè)字節(jié)得存入返回值得起始地址004010EC mov ecx,dword ptr [eax] // eax存儲(chǔ)得是存放返回值得起始地址004010EE mov dword ptr [ebp-30h],ecx // ebp-30 = 下圖得0012FF18004010F1 mov edx,dword ptr [eax+4]004010F4 mov dword ptr [ebp-2Ch],edx004010F7 mov ecx,dword ptr [eax+8]004010FA mov dword ptr [ebp-28h],ecx004010FD mov edx,dword ptr [eax+0Ch]00401100 mov dword ptr [ebp-24h],edx00401103 mov eax,dword ptr [ebp-30h]00401106 mov dword ptr [ebp-20h],eax // ebp-20 = 下圖得0012FF2800401109 mov ecx,dword ptr [ebp-2Ch]0040110C mov dword ptr [ebp-1Ch],ecx0040110F mov edx,dword ptr [ebp-28h]00401112 mov dword ptr [ebp-18h],edx00401115 mov eax,dword ptr [ebp-24h]00401118 mov dword ptr [ebp-14h],eax21: return 0;0040111B xor eax,eax

      圖示:

      當(dāng)返回復(fù)合類型,需要在主調(diào)函數(shù)得棧幀內(nèi)指定一塊內(nèi)存空間。在被調(diào)函數(shù)得棧幀上,會(huì)保存指向主調(diào)函數(shù)存儲(chǔ)返回值得內(nèi)存空間得起始地址。

      -End-

       
      (文/馮思樂)
      免責(zé)聲明
      本文僅代表作發(fā)布者:馮思樂個(gè)人觀點(diǎn),本站未對(duì)其內(nèi)容進(jìn)行核實(shí),請(qǐng)讀者僅做參考,如若文中涉及有違公德、觸犯法律的內(nèi)容,一經(jīng)發(fā)現(xiàn),立即刪除,需自行承擔(dān)相應(yīng)責(zé)任。涉及到版權(quán)或其他問題,請(qǐng)及時(shí)聯(lián)系我們刪除處理郵件:weilaitui@qq.com。
       

      Copyright ? 2016 - 2025 - 企資網(wǎng) 48903.COM All Rights Reserved 粵公網(wǎng)安備 44030702000589號(hào)

      粵ICP備16078936號(hào)

      微信

      關(guān)注
      微信

      微信二維碼

      WAP二維碼

      客服

      聯(lián)系
      客服

      聯(lián)系客服:

      在線QQ: 303377504

      客服電話: 020-82301567

      E_mail郵箱: weilaitui@qq.com

      微信公眾號(hào): weishitui

      客服001 客服002 客服003

      工作時(shí)間:

      周一至周五: 09:00 - 18:00

      反饋

      用戶
      反饋

      午夜久久久久久网站,99久久www免费,欧美日本日韩aⅴ在线视频,东京干手机福利视频
        <strike id="ca4is"><em id="ca4is"></em></strike>
      • <sup id="ca4is"></sup>
        • <s id="ca4is"><em id="ca4is"></em></s>
          <option id="ca4is"><cite id="ca4is"></cite></option>
        • 主站蜘蛛池模板: 性欧美乱妇高清COME| 男女真实无遮挡xx00动态图120秒| 2021av在线视频| 老司机精品视频免费| 激情综合一区二区三区| 日韩免费视频在线观看| 天天干天天射天天操| 国产成人精品一区二区三区| 免费人成视频在线观看网站| 久久综合香蕉久久久久久久| jizzjizz护士| 视频一区中文字幕| 欧美顶级aaaaaaaaaaa片| 把她抵在洗手台挺进撞击视频| 国产老妇一性一交一乱| 四虎在线免费播放| 亚洲一级大黄大色毛片| xxxxx做受大片在线观看免费| 91九色精品国产免费| 爱情岛讨论坛线路亚洲高品质| 日本三级电电影在线看| 国产精品密蕾丝视频| 全免费一级毛片在线播放| 久草免费在线观看视频| 99视频在线精品免费| 美女网站在线观看视频18| 极品无码国模国产在线观看| 天堂资源中文在线| 国产91刮伦脏话对白| 亚洲av永久无码嘿嘿嘿| 99在线观看视频免费| 七次郎在线视频观看精品| 亚洲色图综合在线| 波多野结衣妻奴| 巨粗挺进女县长| 国产亚洲av片在线观看播放| 亚洲国产精品久久久天堂| 久久夜色精品国产欧美乱| 100款夜间禁用b站软件下载| 王雨纯脱得一点不剩| 成人免费一区二区三区视频|