亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費(fèi)注冊(cè) 查看新帖 |

Chinaunix

  平臺(tái) 論壇 博客 文庫(kù)
最近訪問(wèn)板塊 發(fā)新帖
查看: 2978 | 回復(fù): 6
打印 上一主題 下一主題

ebp與esp的疑惑! [復(fù)制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報(bào)告]
發(fā)表于 2013-05-15 12:23 |只看該作者 |倒序?yàn)g覽
本帖最后由 C_H_L 于 2013-05-15 12:24 編輯

最近學(xué)習(xí)AT&T匯編,看到下面一段:
function_label:
                    pushl   %ebp    
                    movl  %esp, %ebp
                    < normal function code goes here>
                    movl %ebp,  %esp
                    popl   %ebp
                    ret
這段代碼,目的是把esp放到ebp中
(1) 為什么紅色部分還要把ebp壓棧、出棧?
(2) 沒(méi)有pushl %ebp 和 popl %ebp難道就不行?
求解!不勝感謝!

論壇徽章:
2
摩羯座
日期:2013-10-10 14:29:04天蝎座
日期:2014-01-03 09:14:49
2 [報(bào)告]
發(fā)表于 2013-05-15 17:36 |只看該作者
這是因?yàn)橐4婧瘮?shù)入口處ebp的值。

論壇徽章:
0
3 [報(bào)告]
發(fā)表于 2013-05-15 18:29 |只看該作者
回復(fù) 2# EricFisher
首先,謝謝你的回答。
是不是說(shuō),如果函數(shù)入口處ebp的值用不到,就沒(méi)必要這樣做?
   

論壇徽章:
0
4 [報(bào)告]
發(fā)表于 2013-05-15 22:58 |只看該作者
結(jié)貼,找到解釋了:
-->IF you are calling a function that modifies registers the main program uses, it is crucial that you save the current state of the registers before calling the function, and then restore them after the function returns.
-->You can either save special registers individually using the PUSH instruction or save all of the registers together using PUSHA instruction before calling the function. Similarly, you can restore the registers back their original state either individually using the POP instruction or together using then POPA instruction.
再次十分感謝樓上的精簡(jiǎn)回答.

論壇徽章:
0
5 [報(bào)告]
發(fā)表于 2013-08-02 11:00 |只看該作者
有些寄存器是調(diào)用函數(shù)保存,有些是被調(diào)用函數(shù)保存。 64位機(jī)器就不需要保存ebp

論壇徽章:
0
6 [報(bào)告]
發(fā)表于 2013-08-20 00:11 |只看該作者
回復(fù) 5# djsxut
我想問(wèn)你兩個(gè)問(wèn)題,如果你能答上,說(shuō)明你真的懂。
(1)Linux procedure的stack frame中,當(dāng)調(diào)用一個(gè)procedure時(shí),frame pointer發(fā)生什么變化?調(diào)用完成,返回caller后,frame pointer又發(fā)生什么變化?
(2)為什么64位機(jī)器就不需要保存ebp?和32位機(jī)器區(qū)別?相比32-bit,有什么進(jìn)步?(這個(gè)問(wèn)題,我沒(méi)研究過(guò),需要你給出解答)
   

論壇徽章:
17
處女座
日期:2013-08-27 09:59:352015亞冠之柏太陽(yáng)神
日期:2015-07-30 10:16:402015亞冠之薩濟(jì)拖拉機(jī)
日期:2015-07-29 18:58:182015年亞洲杯之巴勒斯坦
日期:2015-03-06 17:38:17摩羯座
日期:2014-12-11 21:31:34戌狗
日期:2014-07-20 20:57:32子鼠
日期:2014-05-15 16:25:21亥豬
日期:2014-02-11 17:32:05丑牛
日期:2014-01-20 15:45:51丑牛
日期:2013-10-22 11:12:56雙子座
日期:2013-10-18 16:28:17白羊座
日期:2013-10-18 10:50:45
7 [報(bào)告]
發(fā)表于 2013-08-23 16:08 |只看該作者
回復(fù) 6# C_H_L


    (1)Linux procedure的stack frame中,當(dāng)調(diào)用一個(gè)procedure時(shí),frame pointer發(fā)生什么變化?調(diào)用完成,返回caller后,frame pointer又發(fā)生什么變化?
 函數(shù)調(diào)用時(shí)寄存器的管理使用與函數(shù)的調(diào)用約定相關(guān),是可以變化的。默認(rèn)情況下參數(shù)從右往左開(kāi)始?jí)簵。其stack 布局如下:
               Last argument
               ...
 4(%esp)          First argument
 (%esp)      Return address


    (2)為什么64位機(jī)器就不需要保存ebp?和32位機(jī)器區(qū)別?相比32-bit,有什么進(jìn)步?
         64位CPU除了擴(kuò)展原有的寄存器 (RAX, RBX, RCX, RDX, RSI, RDI, RBP, RSP, RFLAGS, RIP)到64位之外還有8個(gè)64位的通用寄存器(R8-R15),也就是說(shuō)可以有理多的計(jì)算直接使用寄存器來(lái)加速計(jì)算性能。和32位最大的區(qū)別在于默認(rèn)使用的寄存器是64位的。
         64位CPU不使用ebp,它使用RBP,依然需要保存RBP的。在函數(shù)調(diào)用返回時(shí)編譯器生成的代碼可能使用LEAVE來(lái)代替POP。
您需要登錄后才可以回帖 登錄 | 注冊(cè)

本版積分規(guī)則 發(fā)表回復(fù)

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號(hào)-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號(hào):11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報(bào)專區(qū)
中國(guó)互聯(lián)網(wǎng)協(xié)會(huì)會(huì)員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過(guò)ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請(qǐng)注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP