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標號中的指令的棧畫出來,這樣比較清晰

