《學習筆記》王爽組合語言 CALL和RET指令

2021-05-28 08:56:54 字數 2553 閱讀 3361

call和ret都是轉移指令,他們都修改ip,或同時修改cs和ip。他們經常被共同用來實現子程式的設計。

1.ret 和 retf

ret指令用棧中的資料,修改ip的內容,從而實現近轉移。

retf指令用棧中的資料,修改cs和ip的內容,從而實現遠轉移。

cpu執行ret指令的時候,進行下面兩步操作:

(1)(ip)=((ss)*16+(sp))

(2)(sp)=(sp)+2

cpu執行retf指令的時候,進行下面4步操作:

(1)(ip)=((ss)*16+(sp))

(2)(sp)=(sp)+2

(3)(cs)=((ss)*16+(sp))

(4)(sp)=(sp)+2

下面的程式,ret指令執行後,(ip)=0,cs:ip指向**段的第一條指令

assume cs:code

stack segment

db 16 dup (0)

stack ends

code segment

mov ax,4c00h

int 21h

start : mov ax , stack

mov ss , ax

mov sp , 16

mov ax , 0

push ax

mov bx , 0

retcode ends

end start

下面程式中,retf指令執行後,cs:ip指向執行**的第一條指令

assume cs:code

stack segment

db 16 dup (0)

stack ends

codesegment

mov ax , 4c00h

int 21h

start : mov ax , stack

mov ss , ax

mov sp , 16

mov ax , 0

push cs

push ax

mov bx , 0

retf

code ends

end start

2.call 指令

cpu 執行call指令時,進行兩步操作:

(1)當前的ip或cs和ip壓入棧中;

(2)轉移

call 指令不能實現短轉移

3.依據位移進行轉移的call指令

call 標號(將當前的ip壓棧後 , 轉到標號處執行指令)

cpu執行此種格式的call指令時,進行如下操作:

(1)(sp)= (sp)- 2

((ss)* 16 + (sp))= (ip)

(2)(ip)=(ip)+16位位移

4.前面的 call 指令,其對應的機器指令並沒有轉移的目的位址,而是相對於當前ip的轉移位移。

「 call far ptr 」實現的是段間轉移

5.轉移位址在暫存器中的call指令

指令格式:call 16位reg

功能:(sp) = (sp) + 2

((ss)*16+(sp))=(ip)

(ip)=(16位reg)

6.轉移位址在記憶體中的 call 指令

兩種格式:

(1)call word ptr 記憶體單元位址

(2)call dword ptr 記憶體位址單元

7.call 和 ret 的配合使用

我們可以利用call 和 ret 來實現子程式的機制,框架如下:

assume cs:code

code segment

main : ::

call sub1::

mov ax , 4c00h

int 21h

sub1 :::

call sub2::

retsub2 : ::

retcode ens

end main

8.mul 指令

mul是乘法指令,使用mul做乘法的時候,注意以下兩點:

(1)兩個相乘的數:要麼都是8位,要麼都是16位,如果是8位,乙個預設放在al中,另乙個放在8位reg或者記憶體位元組單元中;如果是16位,乙個預設放在ax中,另乙個放在16位reg或者記憶體單元中。

(2)結果:如果是8位乘法,結果預設放在ax中;如果是16位乘法,結果高位預設在dx中存放,低位在ax中存放。

例如:(1)計算100 * 10

mov al , 100

mov bl , 10

mul bl

結果:(ax) = 1000(03e8h)

(2)計算100 * 10000

100小於255,可10000大於255,所以必須做16位乘法:

mov ax , 100

mob bx , 10000

mul bx

結果:(ax) = 4240h , (dx) = 000fh  (f4240h = 100000)

組合語言 王爽 學習筆記

1 mov a,b a b不能同時為一記憶體位址!2 bx bp si di 在 中,這4個暫存器可以單個出現,或只能以4種組合出現 bx和si bx和di bp和si bp和di。如組合 bx si idata 就是合法的。另外,順便說明一點,si di不能分成兩個8位暫存器使用。3 div指令 ...

組合語言 王爽 筆記

關於pop的知識 1.出棧後,ss sp指向新的棧頂,pop操作前的棧頂元素中的資料仍然存在,但是,它已不再棧中 2.ss和sp只記錄了棧頂的位址,依靠ss和sp可以保證在入棧和出棧時找到棧頂 3.當棧滿的時候再次使用push指令入棧,棧空的時候再次使用pop指令出棧,都將發生棧頂越界問題,它是非常...

組合語言 王爽 筆記

1.乙個組合語言程式從寫出到最終執行的簡要過程 編寫,編譯連線,執行 2.可執行檔案中包含兩部分內容 一是程式 從源程式中的彙編指令翻譯過來的機器碼 和資料 源程式中定義的資料 二是相關的描述資訊 eg 程式的大小,要佔的記憶體空間等 3.彙編指令是指有對應的機器碼的指令,可以被編譯為機器指令,最終...