iOS逆向-匯編(六)

  • 棧:是一種具有特殊的訪問方式的存儲(chǔ)空間(后進(jìn)先出, Last In Out Firt,LIFO)
  • 8086會(huì)將CS作為代碼段的段地址,將CS:IP指向的指令作為下一條需要取出執(zhí)行的指令
  • 8086會(huì)將DS作為數(shù)據(jù)段的段地址,mov ax,[address]就是取出DS:address的內(nèi)存數(shù)據(jù)放到ax寄存器中
  • 8086會(huì)將SS作為棧段的段地址,任意時(shí)刻,SS:SP指向棧頂元素
  • 8086提供了PUSH(入棧)和POP(出棧)指令來操作棧段的數(shù)據(jù)
    • 比如push ax是將ax的數(shù)據(jù)入棧,pop ax是將棧頂?shù)臄?shù)據(jù)送入ax

push ax

push ax 的執(zhí)行由以下兩個(gè)步驟完成
  • SP = SP - 2,SS:SP 指向當(dāng)前棧頂前面的單元,以當(dāng)前棧頂前面的單元為新的棧頂;
  • 將ax中的內(nèi)容送入 SS:SP 指向的內(nèi)存單元處,SS:SP此時(shí)指向新棧頂

pop ax

pop ax的執(zhí)行過程和push ax剛好相反,由以下兩步完成
  • 將SS:SP指向的內(nèi)存單元處的數(shù)據(jù)送入ax中;
  • SP=SP+2,SS:SP 指向當(dāng)前棧頂下面的單元,以當(dāng)前棧頂下面的單元為新的棧頂

思考

如果將10000H 到 1000FH 這段空間當(dāng)做棧,初始狀態(tài)棧是空的,此時(shí),SS=1000H,SP=?思考后看分析

  • ???SS:SP執(zhí)行棧控件最高地址單元的下一個(gè)單元

棧頂超界

push
pop
書上圖1.png
書上圖2.png

push&pop匯編

注意:在8086中,push、pop操作的數(shù)據(jù)都是2個(gè)字節(jié)的

練習(xí)

編程:
(1)將10000H到1000FH 這段空間當(dāng)做棧,初始狀態(tài)棧是空的;
(2)設(shè)置AX=001AH,BX=001BH;
(3)利用棧,交換AX和BX中的數(shù)據(jù).


mov ax,1000H
mov ss,ax
mov sp,0010H

mov ax,001AH
mov bx,001BH

push ax
push bx
pop ax
pop bx

棧段

  • 對(duì)于8086來說,在編程時(shí),可以根據(jù)需要,將一組內(nèi)存單元定義為一個(gè)段
  • 我們可以將一組長(zhǎng)度為N(N<=64KB)、地址連續(xù)、起始地址為16倍數(shù)的內(nèi)存單元,當(dāng)做棧空間來使用,稱為棧段。比如用10010H1001FH這段內(nèi)存空間當(dāng)做棧來使用,我們就可以認(rèn)為10010H1001FH是一個(gè)棧段,它的段地址為1001H,長(zhǎng)度為16字節(jié)
  • 如何使用push、pop等棧操作指令訪問我們定義的棧段?
    • 用SS存放棧段的段地址,用SP存放棧頂?shù)钠频刂?/li>

段總結(jié)

練習(xí)

練習(xí)1.png
答案1.png
練習(xí)2.png
答案2.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容