組合語言 6 利用堆疊傳遞引數及堆疊的修正

2021-09-06 04:17:24 字數 3077 閱讀 2704

一、呼叫子程式時資訊的保護與恢復方法

(1) 在子程式中進行

subroute proc

push

axpush

bxpush

cx...

popcx

popbx

popax

retsubroute endp

(2) 在主程式中進行

...push

axpush

bxpush

cxcall

subroute

popcx

popbx

popax

...

二、利用堆疊傳遞引數及堆疊的修正;

將一組bcd數轉換成16位二進位制數

;主程式

stack   segment stack

db 256

dup(?)

stack   ends

data    segment

bcd1    db 07h,06h,07h,02h,03h

leng1   dw 

5result  dw ?

data    ends

codem   segment

assume 

cs:codem, 

ds:data, 

ss:stack

start:

movax,data

movds,ax

;將被轉換的bcd數所在單元段位址、偏移位址、bcd數的位數依次壓棧,傳遞給子程式

push

dslea

si,bcd1

push

simov

cx,leng1

pushcx

; 堆疊內容(

棧底:ds, si, cx)

;呼叫子程式

call

far ptr bcd-16b

popdx

movresult,dx

movah,4ch

int21h

codem  ends

codes   segment

assume  

cs: codes

bcd-16b proc far

; 堆疊內容(

棧底:ds, si, cx, cs, ip

)// cs和ip是由於call far ptr標號指令的呼叫而自動壓入的

push  bp    ;儲存bp

; 堆疊內容(棧底:ds, si, cx, cs, ip, bp)

↑sp當前指向

movbp,sp ;儲存sp

; 堆疊內容(棧底:ds, si, cx, cs, ip, bp)

↑_bp和sp的當前指向

;子程式中的入棧操作

push

dspush

sipush

cxpush

bxpush

ax; 堆疊內容(棧底:ds, si, cx, cs, ip, bp, ds, si, cx, bx, ax)

↑_bp指向           ↑_sp指向

;根據bp取主程式傳遞過來的引數

movcx,[bp]+

6mov si,[bp]+

8mov ds,[bp]+

10;子程式的實際**

addsi,cx

movdx,

0bcdl:

decsi

push

cx  

moval,[si]

andal,0fh

cbwmov

bx,ax

movax,dx

movcx,

10mul

cxmov

dx,ax

adddx,bx

popcx 

loop  bcdl

;計算結果入棧

mov[bp]+

10,dx

;子程式中的出棧操作

popax

popbx

popcx

popsi

popds

; 堆疊內容(棧底:ds, si, cx, cs, ip, bp)

↑_bp和sp的當前指向 ;

恢復bp

popbp

; 堆疊內容(棧底:ds, si, cx, cs, ip)

↑_sp的當前指向 ;

該指令將返回位址彈出堆疊, 同時執行sp+4, 有效地將引數從堆疊中移除並返回到呼叫**片

ret4

; 堆疊內容(棧底:ds, si, cx)

↑_sp的當前指向

bcd-16b endp

codes   ends

end  start

三、利用堆疊傳遞引數的例子

ignore_int:

pushl %eax

;資訊儲存

pushl %ecx

pushl %edx

push

%dspush

%espush

%fs

movl $0x10,%eax

mov%ax,%ds

mov%ax,%es

mov%ax,%fs

pushl $int_msg

;prink函式的引數

call

_printk ; 

popl %eax ;

在printk函式中,pop給eax的是堆疊中的什麼值呢?怎麼放到堆疊中去的?

程式自動處理的?

pop%fs

;資訊恢復

pop%es

pop%ds

popl %edx

popl %ecx

popl %eax

iret

intprintk(const char *fmt, ...)

inttty_write(unsigned channel, char * buf, 

intnr)

參考:procedures and functions

組合語言之堆疊框架

堆疊框架 stack frame 也稱活動框架 activation record 他是為傳遞的引數 子例程的返回位址 區域性變數和儲存的暫存器保留的堆疊空間。堆疊框架的建立步驟 1 如果有傳遞的引數,則壓入堆疊 2 子例程被呼叫,子例程的返回位址壓入堆疊 3 子例程開始執行時,ebp被壓入堆疊 4...

組合語言(七) 堆疊

堆疊資料結構 stack data structure 的原理與盤子堆疊相同 新值新增到棧頂,刪除值也在棧頂移除。堆疊也被稱為 lifo 結構 後進先出,last in first out 其原因是,最後進入堆疊的值也是第乙個出堆疊的值。資料結構就有講 執行時堆疊是記憶體陣列,cpu 用 esp 擴...

彙編中引數的傳遞和堆疊修正2

在經典的組合語言教程中,函式呼叫時堆疊的使用都是著重講解的問題。如今隨著高階語言的越來越完善,單純使用彙編開發的程式已經不多了。但對函式呼叫時堆疊動向的了解仍有助於我們明晰程式的執行流程,從而在程式編寫和除錯的過程中有乙個清晰的思路。一 呼叫約定 在win32中,有關函式的呼叫主要有兩種約定。1 s...