引言:
call和ret都是轉移指令,他們都修改ip,或同時修改cs和ip。
他們經常被共同用來實現程式的設計
10.1 ret和retf
ret指令用棧中的資料,修改ip的內容,從而實現近轉移。
retf指令用棧中的資料,修改cs和ip的內容,從而實現遠轉移;
可以看出,如果我們用彙編語法來解釋ret和retf指令,則
cpu執行ret指令時,相當於進行:
pop ip
cpu執行retf指令時,相當於進行:
pop ip
pop cs
10.2 call指令
cpu執行call指令,進行兩步操作:
1)將當前的ip或cs和ip壓入棧中;
2)轉移
call指令不能實現短轉移,除此之外,call指令實現轉移的方法和jmp指令的原理相同,下面的幾個小節中,我們以給出轉移目的位址的不同方法為主線,講解call指令的主要應用格式
10.3 依據位移進行轉移的call指令
call標號(將當前的ip壓入棧後,轉到標號處執行指令)
cpu執行此種格式的call指令時,進行如下的操作:
1)sp=sp-2
2)ip=ip+16位位移
call標號
16位位移=標號處的位址--call指令後的第乙個位元組的位址;
16位位移的範圍為-32768~32767,用補碼表示
16位位移由編譯程式在編譯時算出。
從上面的描述中,可以看出,如果我們用彙編語法來解釋此種格式的call指令,則:
cpu執行指令call標號時,相當於進行:
push ip
jmp near ptr 標號
10.4 轉移的目的位址在指令中的call指令
前面講解的call指令,其對應的機器指令中並沒有轉移的目的位址,而是相對於當前ip的轉移位移。
指令call far ptr 標號 實現的是段間轉移
cpu執行call fat ptr 標號這種格式的call指令時的操作:
1)sp=sp-2
ssx16+sp=cs
sp=sp-2
ssx16+sp=ip
2)cs=標號所在的段位址
ip=標號所在的偏移位址
cpu執行指令call far ptr 標號時,相當於進行:
push cs
push ip
jmp far ptr 標號
10.5 轉移位址在暫存器中的call指令
指令格式:call 16位暫存器
功能:sp=sp-2
ss*16+sp=ip
ip=(16位暫存器)
彙編語法解釋此種格式的call指令,cpu執行call16位reg時,相當於進行:
push ip
jmp 16位暫存器
10.6 轉移位址在記憶體中的call指令
1)call word ptr 記憶體單元位址
彙編語法解釋:
push ip
jmp word ptr 記憶體單元位址
例如:mov sp,10h
mov ax,0123h
mov ds:[0],ax
call word ptr ds:[0]
執行後,ip=0123h,sp=0eh
2)call dword ptr 記憶體單元位址
彙編語法解釋:
push cs
push ip
jmp dword ptr 記憶體單元位址
例如:mov sp,10h
mov ax,0123h
mov ds:[0],ax
mov word ptr ds:[2],0
call dword ptr ds:[0]
執行後,cs=0,ip=0123h,sp=0ch
10.7 call和ret的配合使用
我們看一下call和ret如何配合使用來實現子程式的機制
我們來看以下cpu執行這個程式的主要過程:
1)cpu將call s指令的機器碼讀入,ip指向了call s後的指令mov bx, ax,然後cpu執行call s指令,將當前的ip值(指令mov bx,ax的偏移位址)壓棧,並將ip的值改變為標號s處的偏移位址。
2)cpu從標號s處開始執行指令,loop迴圈完畢,ax=8
3)cpu將ret指令的機器碼讀入,ip指向了ret指令後的記憶體單元,然後cpu執行ret指令,從棧中彈出乙個值(即call先前壓入棧的mov bx, ax指令的偏移位址)送入ip中。則cs:ip指向指令mov bx ,ax
4)cpu從mov bx ,ax開始執行指令,直至完成。
10.8 mul指令
mul是乘法指令,使用mul做乘法的時候:
1)相乘的兩個數,要麼都是8位,要麼都是16位
8位:al中的8位暫存器或記憶體位元組單元中
16位:ax中的16位暫存器或記憶體字單元中。
2)結果
8位:ax中
16位:dx(高位)和ax(低位)中
格式如下:
mul reg
mul 記憶體單元
記憶體單元可以用不同的定址方式給出,比如:
mul byte ptr ds:[0]
含義為:ax=al*(ds*16+0)
mul word ptr [bx+si+8]
含義為:
ax=al*(ds*16+bx+si+8)結果的低16位
dx=al*(dx*16+bx+si+8)結果的高16位
例如:1)計算100*10
100和10小於255,可以做8位乘法,程式如下:
mov al,100
mov bl,10
mul bl
結果ax=1000
2)計算100*10000
100小於255,可10000大於255,所以必須做16位乘法,程式如下:
mov ax,100
mov bx,10000
mul bx
結果 ax=4240h,dx=000fh
(f4240h=1000000)
10.11批量資料的傳遞
當引數過多時,如何實現引數傳遞?
在這種時候,我們將批量資料放到記憶體中,然後將他們所在記憶體空間的首位址放在暫存器中,傳遞給需要的子程式。
對於具有批量資料的返回結果,也可用同樣的方法。
第10章 CALL和RET指令 筆記
p190 call和ret指令都是轉移指令,它們都修改ip,或同時修改cs和ip。它們經常被共同用來實現子程式的設計。ret指令用棧中的資料,修改ip的內容,從而實現近轉移 cpu執行ret指令時,相當於進行 pop ip retf指令用棧中的資料,修改cs和ip的內容,從而實現遠轉移。cpu執行r...
筆記 組合語言 第10章 CALL和RET指令
10.0 概述 call和ret指令都是轉移指令,它們都修改ip,或同時修改cs和ip。它們經常被用來共同實現子程式的設計。10.1 ret和retf ret指令用棧中的資料,修改ip的內容,即相當於 pop ip retf指令用棧中的資料,修改cs和ip的內容,即相當於 pop ip pop cs...
彙編10 CALL和RET指令
call和ret指令都是轉移指令,它們經常被共同用來實現子程式的設計。ret指令用棧中的資料實現修改ip的內容,從而完成近轉移,執行ret指令時相當於執行 pop ipretf指令用棧中的資料實現修改cs和ip的內容,從而完成遠轉移,執行retf指令相當於執行 pop ip pop cs在程式中就可...