一、呼叫子程式時資訊的保護與恢復方法
(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...