1.
call和ret指令都是轉移指令,它們都修改IP的值,或同時修改CS和IP的值。它們經常共同用語實現子程序的設計。
2.
ret指令用棧中的數據,修改IP的內容,從而實現
近轉移。
3.
retf指令用棧中的數據,修改CS和IP的內容,從而實現
遠轉移。
4.CPU執行ret指令時,相當於進行:
pop IP
執行retf指令時,相當於進行:
pop IP
pop CS
5.CPU執行call指令時,進行兩步操作:
(1)將當前的IP或CS和IP壓入棧中;
(2)轉移
6.
call指令不能實現短轉移,call指令實現轉移的方法和jmp指令的原理相同。
7.
call 標號(將當前的IP壓棧后,轉到標號處執行指令)
CPU執行此種格式的call指令時,進行如下的操作:
(1)(sp)=(sp)-2
((ss)*16+(sp))=(IP)
(2)(IP)=(IP)+16位位移
call執行"call標號"時,相當於進行:
push IP
jmp near ptr 標號
8
."call far ptr 標號"實現的是段間轉移.
CPU執行此種格式的call指令時,進行如下的操作:
(1)(sp)=(sp)-2
((ss)*16+(sp))=(CS)
(sp)=(sp)-2
((ss)*16+(sp))=(IP)
(2)(cs)=標號所在段的段地址
(IP)=標號在段中的偏移地址
CPU執行"call far ptr 標號"時,相當於進行:
push CS
push IP
jmp far ptr 標號
9.
指令格式:call 16位 reg
功能:
(sp)=(sp)-2
((ss)*16+(sp))=(IP)
(IP)=(16位 reg)
CPU執行"call 16位 reg"時,相當於:
push IP
jmp 16 位 reg
10.轉移地址在內存中的call指令有兩種格式.
(1)
call word ptr 內存單元地址
CPU執行"cakk word ptr 內存單元地址"時,相當於:
push IP
jmp word ptr 內存單元地址
(2)
call dword ptr 內存單元地址
CPU執行"calldword ptr 內存單元地址"時,相當於:
push CS
push IP
jmp dword ptr 內存單元地址
11.利用call和ret可以實現
子程序的機制,框架如下:
標號:
指令
ret
12.
mul是乘法指令,使用mul做乘法的時候需注意一下兩點.
(1)
兩個相乘的數:兩個相乘的數,要么都是8位,要么都是16位.如果是8位,默認放在AL中,另一個放在8位的reg或內存字節單元中;如果是16位,一個默認放在AX中,另一個放在16位reg過內存字單元中.
(2)
結果:如果是8位乘法,默認放在AX中;如果是16位乘法,結果高位放在DX中,低位放在AX中.
格式如下:
mul reg
mul 內存單元
例如:
(1)計算100*10
mov al,100
mov bl,10
mul bl
結果:(AX)=1000(03E8H)
(2)計算100*10000
mov ax,100
mov bx,10000
mul bx
結果:(AX)=4240H,(DX)=000FH (F4240H=1000000)
13.call和ret指令共同支持了匯編語言編程中的
模塊化設計.
14.
用寄存器來存儲參數和結果是最常用的方法.
15.對於
批量數據的傳遞,我們將它放在內存中,然后將它們所在內存控件的首地址放在寄存器中,傳遞給需要的子程序.(聯想:C的指針和數組關系)
16.當出現寄存器沖突時(如多次使用CX),解決方法是在子程序的開始將子程序中所有用到的寄存器中的值都保存起來,在子程序返回前再恢復(
棧的使用)