8086匯編 call 指令
字面意思:調用子程序
實質:流程轉移指令,它們都修改IP,或同時修改CS和IP
call指令實現轉移的方法和 jmp 指令的原理相似
格式:call 標號
返回指令:ret、retf
call 指令說明
CPU執行call指令,進行兩步操作:
(1)將當前的 IP 或 CS和IP 壓入棧中;
(2)轉移到標號處執行指令。
call 標號:
- 16位位移=“標號”處的地址-call指令后的第一個字節的地址;
- 16位位移的范圍為 -32768~32767,用補碼表示;
- 16位位移由編譯程序在編譯時算出。
CPU執行“call far ptr 標號”時的操作:
(1) (sp) = (sp) – 2
((ss) ×16+(sp)) = (CS)
(sp) = (sp) – 2
((ss) ×16+(sp)) = (IP)
(2) (CS) = 標號所在的段地址
(IP) = 標號所在的偏移地址
CPU執行“call near ptr 標號”時的操作:
“call 標號”類似”jmp near ptr 標號”,對應的機器指令中為相對於當前IP的轉移位移,而不是轉移的目的地址,實現段內轉移。指令“call far ptr 標號”實現的是段間轉移!
ret、retf
使用案例
1、案例模板
說明:在程序走到call s時會直接跳轉到 s: add ax, 1 這里列處理返回值ret以上指令當遇到ret后會返回到 mov ax, 4c00h 行接着往下執行。
mov ax, 0 ; 使用主程序 s call s mov ax, 4c00h int 21h ; 創建主程序s s: add ax, 1 ; 返回 ret