匯編語言筆記10-CALL和RET指令


 轉載必須注明出處,違者必究。http://www.cnblogs.com/dennisOne

模塊化程序設計

  1. 模塊化程序設計

    匯編語言通過callret指令實現了模塊化程序設計。可以實現多個相互聯系、功能獨立的子程序來解決一個復雜的問題。

  2. 子程序的框架
     1 assume cs:code
     2 code segment
     3     main:     :
     4               :
     5               call sub1          ; 調用子程序sub1
     6               :
     7               :
     8               mov ax, 4c00h
     9               int 21h
    10     
    11     sub1:     :                  ; 子程序sub1開始
    12               :
    13               call sub2          ; 調用子程序sub2
    14               :
    15               :
    16               ret                ; 子程序返回
    17      
    18     sub2:     :                  ; 子程序sub2開始
    19               :
    20               :
    21               ret                ; 子程序返回
    22 code ends
    23 end main

     

callret指令

指令

功能

匯編語法解釋

備注

ret

用棧中的數據,修改IP的內容,

實現近轉移。

pop IP

  

retf

用棧中的數據,修改CSIP的內容,

實現遠轉移。

pop IP

pop CS

  

retn

  

pop IP

add sp, n

見后面

   

   

   

   

   

call

   

   

   

   

call指令分為兩步:

(1) 將當前的IP或者CSIP壓入棧中。

(2) 轉移。

格式

匯編語法解釋

call 標號

push IP

jmp near ptr 標號

call far 標號

push CS

push IP

jmp far ptr 標號

call 16reg

push IP
jmp 16reg

call word ptr 內存單元地址

push IP
jmp word ptr 內存單元地址

call dword ptr 內存單元地址

push CS
push IP
jmp dword ptr 內存單元地址

   

   

   

call

   

muldiv指令

指令格式

解釋

示例


mul reg

mul 內存單元

(1) 8位乘法:默認乘子一個放在AL中,另一個放在8reg或者內存字節單元中。默認結果放在AX

(2)16位乘法:默認乘子一個放在AX中,另一個放在16reg或者內存字單元中。默認結果放在DX|AX中。

mul byte ptr ds:[0]

; (ax)=(al)*((ds)*16+0)

   

mul word ptr [bx+si+8]

; (dx|ax)=(ax)*((ds)*16+(bx)+(si)+8)

div reg

div 內存單元

(1)16/8: 被除數默認放在AX中,除數放在8reg或者內存字節單元中。結果AL()AH(余數)

(2)32/16: 被除數默認DX|AX中,除數放在16reg或者內存字單元中。結果AX(), DX(余數)

(3)會產生越界問題(如何設計安全的div見后面)

div byte ptr ds:[0]
; (al) = (ax)/((ds)*16+0)的商
; (ah) = (ax)/((ds)*16+0)的余數

div word ptr [bx+si+8]

; (ax)=(ax)/((ds)*16+(bx)+(si)+8)的商

; (dx)=(ax)/((ds)*16+(bx)+(si)+8)的余數

   

參數和結果傳遞

位置

優點

缺點

示例

   

   

   

放在寄存器中

   

   

   

最常見的方法

快速

   

   

   

寄存器數量有限,

寄存器可能會沖突

; 說明:計算N3次方

; 參數: (bx)=N

; 結果: (dx:ax)=N^3

cube:        mov ax, bx

mul bx

mul bx

ret

放在數據段中

批量數據的傳遞

速度慢

; ds:si指向字符串(批量數據)所在空間的首地址

; cx存放字符串的長度

capital:        and byte ptr [si], 11011111b

inc si

loop capital

ret

放在棧中

C語言的方式

簡單方便

  

詳細解釋

   

  • 1:用棧傳遞參數

    結合C語言的函數調用來學習棧傳遞參數的思想。

     

     1 ; 說明:計算(a-b)^3,a、b為字型數據
     2 ; 參數:進入子程序時候,棧頂存放IP,后面依次存放a、b
     3 ; 結果:(dx:ax)=(a-b)^3
     4 difcube:    push bp
     5              mov bp, sp
     6              mov ax, [bp+4]     ;將棧中a的值送入ax中
     7              sub ax, [bp+6]     ; a-b
     8              mov bp, ax
     9              mul bp
    10              mul bp
    11              pop bp
    12              ret 4              ; 彈出參數(將棧頂指針修改為調用前的值)
    13     
    14 ;指令ret n的含義:
    15 ;    pop ip
    16 ;    add sp,n 

    使用棧進行參數傳遞,所以調用者在匯編程序的時候要向棧中壓入參數,子程序在返回的時候可以使用ret n指令將棧頂指針修改為調用前的值。

  • 2 C語言處理方式(局部變量,也是使用棧)
     1 void add(int, int, int);
     2     
     3 void main()
     4 {
     5     int a = 1;
     6     int b = 2;
     7     int c = 0;
     8     add(a, b, c);
     9     c++; 
    10 }
    11     
    12 void add(int a, int b, int c)
    13 {
    14      c = a + b;
    15 }

                


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM