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

正文內(nèi)容

x86匯編語(yǔ)言學(xué)習(xí)(參考版)

2025-04-10 07:00本頁(yè)面
  

【正文】 ELF動(dòng)態(tài)解析符號(hào)過(guò)程(修訂版) Linux ATamp。 X86 匯編語(yǔ)言學(xué)習(xí)手記(1) 并且,利用Solaris提供的mdb工具,直觀(guān)的觀(guān)察到了棧在程序運(yùn)行中的動(dòng)態(tài)變化,以及Stack Frame的創(chuàng)建和撤銷(xiāo),根據(jù)給出的圖例的內(nèi)容(圖 21和圖 11),可以更清晰的了解IA32架構(gòu)中棧在內(nèi)存中的布局(Stack Layer)。 SFP ??蚣苤羔? 圖 21 3. 小結(jié) | ++ 低地址 | k (EBP0xc) | | ++ | j (EBP8) | i (EBP4) | main函數(shù)的EBP指針(即SFP框架指針) ++ i=3 $3,4(%ebp) k=4 $4,0xc(%ebp) j=2 $2,8(%ebp) 而反匯編的結(jié)果中: int i, j=2, k=4。 問(wèn)題:定義了多個(gè)局部變量時(shí),棧分配順序是怎樣的? 表達(dá)式計(jì)算,結(jié)果指定為16進(jìn)制 16進(jìn)制換算10進(jìn)制 0xb8=D main+0x19: main+0x18: movl %eax,%esp main+0x11: movl main+0xc: andl main+9: 。 $0xb8,%esp subl %esp,%ebp %ebp pushl main: Loading modules: [ ] } return 0。 char str2[100]。 char str1[50]。 int main() 下面動(dòng)手驗(yàn)證一下: 如果,各定義一個(gè)50字節(jié)和100字節(jié)的字符數(shù)組,在這種情況下,實(shí)際分配多少棧空間呢?答案是0x8+0x40+0x70,即184字節(jié)。 在X86 匯編語(yǔ)言學(xué)習(xí)手記(1)里,已經(jīng)說(shuō)明過(guò)gcc默認(rèn)的編譯是要16字節(jié)棧對(duì)齊的,subl $8,%esp會(huì)使棧16字節(jié)對(duì)齊,而8字節(jié)空間只能滿(mǎn)足2個(gè)局部變量,如果再分配4字節(jié)滿(mǎn)足第3個(gè)局部變量的話(huà),那棧地址就不再16字節(jié)對(duì)齊的,而同時(shí)滿(mǎn)足空間需要而且保持16字節(jié)棧對(duì)齊的最接近的就是0x18。 答案就是:保持16字節(jié)棧對(duì)齊。 而在3個(gè)局部變量的時(shí)候,分配棧空間的指令是:subl $0x18,%esp 問(wèn)題:為什么3個(gè)變量分配了0x18字節(jié)的??臻g? main函數(shù)返回 ret 撤銷(xiāo)Stack Frame leave 將k的值裝入EAX,作為返回值 0xc(%ebp),%eax main+0x37: 。 addl 將k的地址裝入到EAX 0xc(%ebp),%eax main+0x32: 。 addl 將i的值裝入到 EDX 4(%ebp),%edx main+0x2d: 。 movl i++ incl 將i的地址裝入到EAX 4(%ebp),%eax main+0x25: 。 movl k=4 $4,0xc(%ebp) main+0x17: 。 movl main+6至main+0xe,再次保證棧16字節(jié)對(duì)齊 %eax,%esp $0,%eax $0xf0,%esp 為局部變量i,j,k分配??臻g,并保證棧16字節(jié)對(duì)齊 main+3: 。 movl main+1: main::dis mdb test3 編譯該程序后,用mdb反匯編得出如下結(jié)果: { vi 那么本例中,由于i和j正好是8字節(jié),那么如果存在2個(gè)以上的局部變量時(shí),如何同時(shí)滿(mǎn)足空間分配和棧對(duì)齊呢? 2. 兩個(gè)以上的局部變量的棧分配 問(wèn)題:當(dāng)存在2個(gè)以上的局部變量時(shí),如何進(jìn)行棧對(duì)齊? addl movl $8,%esp ,可以通過(guò)esp減去所需字節(jié)數(shù) EAX的值為6,還是main函數(shù)的返回值 _start的SFP,之前存儲(chǔ)在地址0x8047db8處,main的Stack Frame撤銷(xiāo)時(shí)恢復(fù) 8047dd8 0x8047ef3 0x8047df8: 0x8047edd 0x8047df0: 0x8047eba 0x8047de8: 0x8047eb4 0x8047de0: 0 。 0x8047dd8: 0x8047dd4: _fini 0x8047dcc: 0x8047dec 0x8047dc4: 。 0x8047dc0: 此時(shí)main已經(jīng)返回,_start+0x5d曾經(jīng)存儲(chǔ)在地址0x8047dbc處 addl mdb: target stopped at: 。eax=Xesp,10/nap。 。 6 。 0x8047df8: 0x8047edd 0x8047df0: 0x8047eba 0x8047de8: 0x8047eb4 0x8047de0: 0 0x8047dd8: 0x8047dd4: _fini 0x8047dcc: 0x8047dec 0x8047dc4: 1 Stack Frame已經(jīng)被撤銷(xiāo),棧頂是返回_start后的EIP,main的棧已被釋放 _start+0x5d 0x8047dbc: 。 main+0x2a: mdb: stop at main+0x2a 。ebp=X。 :c。 EAX的值,即函數(shù)的返回值,當(dāng)前為6 6 。 0x8047dec: 0 0x8047de4: 1 0x8047ddc: 0 `atexit_fini 0x8047dd0: _start+0x35 0x8047dc8: 0x8047de4 0x8047dc0: 。 0x8047dbc: 。 0x8047db8: 。 0x8047db4: 這是變量j,4字節(jié),值為2,此處為棧頂,ESP的值就是0x8047db0 2 0x8047db0: 。 main+0x29: mdb: stop at main+0x29 。ebp=X。 :c。 。 這是main當(dāng)前EBP寄存器的值,即main的SFP 8047db8 0x8047eba 0x8047de8: 0x8047eb4 0x8047de0: 0 0x8047dd8: 0x8047dd4: _fini 0x8047dcc: 0x8047dec 0x8047dc4: 1 這是返回_start后的EIP _start+0x5d 這是_start的SFP,4字節(jié) 0x8047dd8 。 0x8047db4: 。 0x8047db0: 程序運(yùn)行到斷點(diǎn)main+0x1e處停止,此時(shí)局部變量i,j賦值已完成 4(%ebp),%eax main+0x1e: mdb: stop at main+0x1e 。ebp=X。 :c。 。 這是main當(dāng)前EBP寄存器的值,即main的SFP 8047db8 0x8047eba 0x8047de8: 0x8047eb4 0x8047de0: 0 _start的SFP指向的內(nèi)容為0,證明_start是程序的入口 0 `atexit_fini 0x8047dd0: _start+0x35 0x8047dc8: 0x8047de4 0x8047dc0: 。 0x8047d
點(diǎn)擊復(fù)制文檔內(nèi)容
公司管理相關(guān)推薦
文庫(kù)吧 www.dybbs8.com
備案圖鄂ICP備17016276號(hào)-1