freepeople性欧美熟妇, 色戒完整版无删减158分钟hd, 无码精品国产vα在线观看DVD, 丰满少妇伦精品无码专区在线观看,艾栗栗与纹身男宾馆3p50分钟,国产AV片在线观看,黑人与美女高潮,18岁女RAPPERDISSSUBS,国产手机在机看影片

正文內容

x86匯編語言學習-資料下載頁

2025-04-07 07:00本頁面
  

【正文】 6 。 EAX的值為6,還是main函數(shù)的返回值 通過mdb對程序運行時的寄存器和棧的觀察和分析,可以得出局部變量在棧中的訪問和分配及釋放方式: ,可以通過esp減去所需字節(jié)數(shù) subl $8,%esp ,可以通過leave指令 leave ,可以通過ebp減去偏移量 movl 8(%ebp),%eax addl 4(%ebp),%eax 問題:當存在2個以上的局部變量時,如何進行棧對齊? 在上篇文章中,提到subl $8,%esp語句除了分配??臻g外,還有一個作用就是棧對齊。那么本例中,由于i和j正好是8字節(jié),那么如果存在2個以上的局部變量時,如何同時滿足空間分配和棧對齊呢? 2. 兩個以上的局部變量的棧分配 在之前的C程序中,增加局部變量定義k,程序如下: vi int main() { int i, j=2, k=4。 i=3。 i=++i。 k=i+j+k。 return k。 } 編譯該程序后,用mdb反匯編得出如下結果: gcc o test3 mdb test3 Loading modules: [ ] main::dis main: pushl %ebp main+1: movl %esp,%ebp 。 main至main+1,創(chuàng)建Stack Frame main+3: subl $0x18,%esp 。 為局部變量i,j,k分配棧空間,并保證棧16字節(jié)對齊 main+6: andl $0xf0,%esp main+9: movl $0,%eax main+0xe: subl %eax,%esp 。 main+6至main+0xe,再次保證棧16字節(jié)對齊 main+0x10: movl $2,8(%ebp) 。 j=2 main+0x17: movl $4,0xc(%ebp) 。 k=4 main+0x1e: movl $3,4(%ebp) 。 i=3 main+0x25: leal 4(%ebp),%eax 。 將i的地址裝入到EAX main+0x28: incl (%eax) 。 i++ main+0x2a: movl 8(%ebp),%eax 。 將j的值裝入到 EAX main+0x2d: movl 4(%ebp),%edx 。 將i的值裝入到 EDX main+0x30: addl %eax,%edx 。 j+i,結果存入EDX main+0x32: leal 0xc(%ebp),%eax 。 將k的地址裝入到EAX main+0x35: addl %edx,(%eax) 。 i+j+k,結果存入地址ebp0xc即k中 main+0x37: movl 0xc(%ebp),%eax 。 將k的值裝入EAX,作為返回值 main+0x3a: leave 。 撤銷Stack Frame main+0x3b: ret 。 main函數(shù)返回 問題:為什么3個變量分配了0x18字節(jié)的棧空間? 在2個變量的時候,分配??臻g的指令是:subl $8,%esp 而在3個局部變量的時候,分配??臻g的指令是:subl $0x18,%esp 3個整型變量只需要0xc字節(jié),為何實際上分配了0x18字節(jié)呢? 答案就是:保持16字節(jié)棧對齊。 在X86 匯編語言學習手記(1)里,已經(jīng)說明過gcc默認的編譯是要16字節(jié)棧對齊的,subl $8,%esp會使棧16字節(jié)對齊,而8字節(jié)空間只能滿足2個局部變量,如果再分配4字節(jié)滿足第3個局部變量的話,那棧地址就不再16字節(jié)對齊的,而同時滿足空間需要而且保持16字節(jié)棧對齊的最接近的就是0x18。 如果,各定義一個50字節(jié)和100字節(jié)的字符數(shù)組,在這種情況下,實際分配多少棧空間呢?答案是0x8+0x40+0x70,即184字節(jié)。 下面動手驗證一下: vi int main() { char str1[50]。 char str2[100]。 return 0。 } mdb test4 Loading modules: [ ] main::dis main: pushl %ebp main+1: movl %esp,%ebp main+3: subl $0xb8,%esp 。 為兩個字符數(shù)組分配棧空間,同時保證16字節(jié)對齊 main+9: andl $0xf0,%esp main+0xc: movl $0,%eax main+0x11: subl %eax,%esp main+0x13: movl $0,%eax main+0x18: leave main+0x19: ret 0xb8=D 。 16進制換算10進制 184 0x40+0x70+0x8=X 。 表達式計算,結果指定為16進制 b8 問題:定義了多個局部變量時,棧分配順序是怎樣的? 局部變量棧分配的順序是按照變量聲明先后的順序,同一行聲明的變量是按照從左到右的順序入棧的,變量聲明如下: int i, j=2, k=4。 而反匯編的結果中: movl $2,8(%ebp) 。 j=2 movl $4,0xc(%ebp) 。 k=4 movl $3,4(%ebp) 。 i=3 其中不難看出,i,j,k的棧中的位置如下圖: ++ 高地址 | EIP (_start函數(shù)的返回地址) | ++ | EBP (_start函數(shù)的EBP) | main函數(shù)的EBP指針(即SFP框架指針) ++ | i (EBP4) | ++ | j (EBP8) | ++ | k (EBP0xc) | ++ 低地址 圖 21 3. 小結 這次通過幾個試驗程序,進一步了解了局部變量在棧中的分配和釋放以及位置,并再次回顧了上篇文章中涉及到的以下概念: SFP 棧框架指針 Stack aligned 棧對齊 并且,利用Solaris提供的mdb工具,直觀的觀察到了棧在程序運行中的動態(tài)變化,以及Stack Frame的創(chuàng)建和撤銷,根據(jù)給出的圖例的內容(圖 21和圖 11),可以更清晰的了解IA32架構中棧在內存中的布局(Stack Layer)。 相關文檔: X86 匯編語言學習手記(1) Solaris 上的開發(fā)環(huán)境安裝及設置 Linux ATamp。T 匯編語言開發(fā)指南 ELF動態(tài)解析符號過程(修訂版) 關注: Solaris 10的10大新變化16 / 16
點擊復制文檔內容
公司管理相關推薦
文庫吧 www.dybbs8.com
備案圖鄂ICP備17016276號-1