第10章 call和ret指令

2022-06-23 12:27:14 字數 3301 閱讀 6997

引言:

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在程式中就可...