1. 程式人生 > >第十章 CALL和RET指令

第十章 CALL和RET指令

一、ret和retf

ret:用棧中的資料修改IP的值,從而實現近轉移。

ret指令的兩步操作:

(IP)=((SS)*16+(SP));(SP)=(SP)+2。

retf:用棧中的資料修改CS和IP的值,從而實現遠轉移。

retf指令的四步操作:

(IP)=((SS)*16+(SP));(SP)=(SP)+2;(CS)=((SS)*16+(SP));(SP)=(SP)+2。

二、call指令

兩步操作:

①將當前的IP或CS和IP壓入棧中。

②轉移。

call指令不能實現短轉移。

三、依據位移進行轉移的call指令

call  標號(將當前的IP壓棧後,轉移到標號處執行指令)(段內近轉移)

兩步操作:(SP)=(SP)-2   ((SS)*16+(SP))=(IP);(IP)=(IP)+16位位移。

call  標號=push IP 

                 jump  near ptr  標號

四、轉移的目的地址在指令中的call指令

call far ptr 標號(將當前的CS和IP壓棧後,轉移到標號處執行指令)(段間轉移)

四步操作:(SP)=(SP)-2   ;((SS)*16+(SP))=(CS);(SP)=(SP)-2   ;((SS)*16+(SP))=(IP)

call far ptr 標號=push CS

                          push IP

                          jmp far ptr  標號

 五、轉移地址在暫存器中的call指令

call 16 位reg(16位暫存器)

兩步操作:(SP)=(SP)-2;((SS)*16+(SP))=(IP)=(16位reg)

call  16位reg=push IP

                       jmp  16位reg

六、轉移地址在記憶體中的call指令

call word ptr 記憶體單元地址

call word ptr 記憶體單元地址=push IP

                                             jmp word ptr 記憶體單元地址

call dword ptr 記憶體單元地址

call dword ptr 記憶體單元地址=push CS

                                              push IP

                                              jmp dword ptr 記憶體單元地址

總結call格式:

七、call和ret的配合使用(例題)

 

八、mul指令

①兩個數相乘:兩個相乘的數必須都是8位或者都是16位。都是8位時:一個預設放在AL中,另一個放在8位reg或者記憶體位元組單元;都是16位時:一個放在AX中,另一個放在16位reg或記憶體子單元中。

②結果:都是8位時:預設放在AX中;都是16位時:高位預設放在DX中存放,低位放在AX中。

九、模組化程式設計(略)

十、引數和結果傳遞的問題(例題)

 

十一、批量資料的傳送(例題)

 

十二、暫存器衝突的問題

暫存器用作引數傳遞時,由於暫存器個數有限,且有些暫存器在指令中有特殊用途,如cx在loop和jcxz指令中的"專用",al, ah, ax, dx在mul指令和div指令中的"專用"等。因此,在子程式和主程式中可能會出現暫存器使用衝突的問題,造成程式執行有誤。