第十章 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指令中的"專用"等。因此,在子程式和主程式中可能會出現暫存器使用衝突的問題,造成程式執行有誤。