轉載必須注明出處,違者必究。http://www.cnblogs.com/dennisOne
☞模塊化程序設計
-
模塊化程序設計
匯編語言通過call和ret指令實現了模塊化程序設計。可以實現多個相互聯系、功能獨立的子程序來解決一個復雜的問題。
-
子程序的框架
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
☞call和ret指令
指令 |
功能 |
匯編語法解釋 |
備注 |
||||||||||||
ret |
用棧中的數據,修改IP的內容, 實現近轉移。 |
pop IP |
|
||||||||||||
retf |
用棧中的數據,修改CS和IP的內容, 實現遠轉移。 |
pop IP pop CS |
|
||||||||||||
retn |
|
pop IP add sp, n |
見后面 |
||||||||||||
call |
call指令分為兩步: (1) 將當前的IP或者CS和IP壓入棧中。 (2) 轉移。 |
|
call 指 令 不 能 實 現 短 轉 移 |
☞mul和div指令
指令格式 |
解釋 |
示例 |
mul 內存單元 |
(1) 8位乘法:默認乘子一個放在AL中,另一個放在8位reg或者內存字節單元中。默認結果放在AX中 (2)16位乘法:默認乘子一個放在AX中,另一個放在16位reg或者內存字單元中。默認結果放在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中,除數放在8位reg或者內存字節單元中。結果AL(商),AH(余數)。 (2)32位/16位: 被除數默認DX|AX中,除數放在16位reg或者內存字單元中。結果AX(商), DX(余數)。 (3)會產生越界問題(如何設計安全的div見后面) |
div byte ptr ds:[0] ; (ax)=(ax)/((ds)*16+(bx)+(si)+8)的商 ; (dx)=(ax)/((ds)*16+(bx)+(si)+8)的余數 |
☞參數和結果傳遞
位置 |
優點 |
缺點 |
示例 |
放在寄存器中 |
最常見的方法 快速 |
寄存器數量有限, 寄存器可能會沖突 |
; 說明:計算N的3次方 ; 參數: (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 }