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.彙編指令是指有對應的機器碼的指令,可以被編譯為機器指令,最終...