call指令模擬C語言函數調用


1.執行call指令時,有以下2步操作:

a).將當前ip或cs和ip壓入棧中。

b).跳轉到標號處。

call lable(標號),將當前ip壓棧后,轉移到標號處執行。

call far ptr lable,實現段間轉移。將當前cs和ip壓棧,轉移到far ptr lable標號處執行。

call reg16/mem16(16位寄存器/2個字節內存),將當前ip壓棧后,轉移到reg16/mem16。

call word ptr,將當前ip壓棧后,轉移到word ptr內存單元處執行。

2.實現模擬C語言函數調用模板

 1 data segment
 2 g_szString db "HelloWorld$"
 3 data ends
 4 
 5 stack1 segment stack
 6     org 64
 7 stack1 ends
 8 
 9 code1 segment
10 assume cs:code1,ds:data
11 fun_add:    ;__cdecl
12     push bp    ;bp壓棧
13     mov bp, sp   ;保存棧底
14     
15     sub sp, 20h  ;提升棧頂,申請局部變量空間
16     mov  word ptr [bp-04h], 03h      ;局部變量
17     mov word ptr [bp-02h], 02h
18     
19     mov ax, [bp+6]    ;參數b
20     mov bx, [bp+8]      ;參數a
21     add ax,bx        ;計算
22     
23     mov sp, bp
24     pop bp
25     
26     retf     ;__cdecl調用方式
27 code1 ends    
28     
29 code segment
30 assume cs:code,ds:data
31 START:
32     mov ax,5    
33     push ax    ;參數a=5壓棧
34     mov bx,6
35     push bx    ;參數b=6壓棧
36     
37     call far ptr fun_add
38     add sp,4    ;平衡棧
39     
40     mov ax,4c00h
41     int 21h
42     ret
43     
44 code ends
45 end START

 下面一張圖顯示call fun_add指令后,沒有執行fun_add標號里面的指令時,返回地址以及參數壓棧情況

 上圖顯示了call執行情況,現把顯示call標號前和call標號中的指令的棧畫出來,這樣比較清晰

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM