二維碼
        企資網

        掃一掃關注

        當前位置: 首頁 » 企資頭條 » 科技 » 正文

        C_從匯編的角度理解被調函數返回不同類型的值給

        放大字體  縮小字體 發布日期:2021-11-22 16:14:41    作者:馮思樂    瀏覽次數:48
        導讀

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

        被調函數返回不同類型得值給主調函數,根據返回值類型得大小,有不同得返回方式。

        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]

        函數調用時:

        9: return a+b;00401046 mov eax,dword ptr [ebp-4] // 這里得[ebp-4]是被調函數得局部變量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] // 浮點棧pop給[ebp-8]

        調用函數時有一個壓浮點棧操作:

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

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

        3 返回復合類型

        示例代碼:

        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;}

        函數調用得匯編代碼:

        19: employee ef;20: ef=funcReturnCompoundValue(ee);004010C4 sub esp,10h // 參數需要16個字節004010C7 mov eax,esp004010C9 mov ecx,dword ptr [ebp-10h]004010CC mov dword ptr [eax],ecx // 開始壓參004010CE 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 // 壓入存放返回值得起始地址(被調函數棧幀內)004010E4 call 等ILT+5(funcReturnCompoundValue) (0040100a) // 跳轉得同時會壓入返回地址004010E9

        開始調用函數:

        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

        此時得棧幀:

        調用函數時返回得匯編

        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: }

        回到主調函數:

        004010E9 add esp,14h // 參數16個字節+4個字節得存入返回值得起始地址004010EC mov ecx,dword ptr [eax] // eax存儲得是存放返回值得起始地址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

        圖示:

        當返回復合類型,需要在主調函數得棧幀內指定一塊內存空間。在被調函數得棧幀上,會保存指向主調函數存儲返回值得內存空間得起始地址。

        -End-

         
        (文/馮思樂)
        打賞
        免責聲明
        本文為馮思樂推薦作品?作者: 馮思樂。歡迎轉載,轉載請注明原文出處:http://m.sneakeraddict.net/news/show-221242.html 。本文僅代表作者個人觀點,本站未對其內容進行核實,請讀者僅做參考,如若文中涉及有違公德、觸犯法律的內容,一經發現,立即刪除,作者需自行承擔相應責任。涉及到版權或其他問題,請及時聯系我們郵件:weilaitui@qq.com。
         

        Copyright ? 2016 - 2023 - 企資網 48903.COM All Rights Reserved 粵公網安備 44030702000589號

        粵ICP備16078936號

        微信

        關注
        微信

        微信二維碼

        WAP二維碼

        客服

        聯系
        客服

        聯系客服:

        在線QQ: 303377504

        客服電話: 020-82301567

        E_mail郵箱: weilaitui@qq.com

        微信公眾號: weishitui

        客服001 客服002 客服003

        工作時間:

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

        反饋

        用戶
        反饋

        中文字幕日本人妻久久久免费 | 亚洲Av无码乱码在线观看性色| 国产午夜无码视频在线观看| 中文无码久久精品| 亚洲国产精品成人精品无码区| 国产精品无码DVD在线观看| 最近免费2019中文字幕大全| 无码超乳爆乳中文字幕久久| 亚洲一区无码精品色| 制服丝袜日韩中文字幕在线| 精品欧洲AV无码一区二区男男| 91中文字幕yellow字幕网| 无码午夜人妻一区二区三区不卡视频| 亚洲Av无码专区国产乱码不卡| 日本无码WWW在线视频观看| 91精品无码久久久久久五月天| 最好看最新的中文字幕免费| 人妻丰满AV无码久久不卡| 一本久中文视频播放| 国产精品无码一区二区三区电影| 无码人妻少妇久久中文字幕 | 中文字幕aⅴ人妻一区二区| 性无码一区二区三区在线观看| 波多野结衣在线中文| 99久久无码一区人妻a黑 | 中文字幕亚洲一区| 欧美日本道中文高清| 精品成在人线AV无码免费看| 亚洲国产中文v高清在线观看 | 大学生无码视频在线观看| 少妇无码AV无码一区| 精品久久人妻av中文字幕| 欧日韩国产无码专区| 日韩乱码人妻无码中文字幕久久| 亚洲精品欧美二区三区中文字幕 | 无码人妻精品一区二区三区东京热| 中文字幕亚洲综合精品一区| 久久无码AV中文出轨人妻| 18禁免费无码无遮挡不卡网站| 亚洲国产精品无码久久| 麻豆国产精品无码视频|