汇编语言笔记10-CALL和RET指令
?模塊化程序設計
匯編語言通過call和ret指令實現了模塊化程序設計。可以實現多個相互聯系、功能獨立的子程序來解決一個復雜的問題。
?
?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 }
? ? ? ? ? ??
總結
以上是生活随笔為你收集整理的汇编语言笔记10-CALL和RET指令的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: NASM中SECTION的概念
- 下一篇: 实模式寻址方式