用 MUL 指令做乘法
格式
- MUL 暫存器
- MUL 寄存單元
8 位乘法 | 16 位乘法 | |
---|---|---|
被乘數(預設) | AL | AX |
乘數 | 8 位暫存器或記憶體單元 | 16 位暫存器或記憶體字單元 |
結果 | AX | DX (高位) 和 AX (低位) |
模組化程式設計
- 呼叫子程式 : CALL 指令
- 返回 : RET 指令
實質
流程轉移指令,它們都修改 IP ,或同時修改 CS 和 IP
CALL 指令
字面意思
呼叫子程式
實質
- 流程轉移
- CALL 指令實現轉移的方法和 JMP 指令的原理相似
格式
CALL 標號
- 16 位位移 = “標號”處的地址 - CALL 指令後的第一個位元組的地址
- 16 位位移的範圍為 \([-32768,32767]\) ,用補碼錶示
- 16 位位移由編譯程式在編譯時算出。
CPU 執行 CALL 指令的流程
- 將當前 IP 或 CS 和 IP 壓入棧中
- 轉移到標號處執行指令
CPU 執行 CALL 指令的原理
- (SP) = (SP) - 2 ((SS) * 16 + (SP)) = (IP)
- (IP) = (IP) + 16 位位移
相當於PUSH IP
再JMP NEAR PTR 標號
CALL FAR PTR 標號
實現的是段間轉移
CPU 執行 CALL FAR PTR 標號
時的操作
(SP) = (SP) - 2
((SS) * 16 + (SP)) = (CS)
(SP) = (SP) - 2
((SS) * 16 + (SP)) = (IP)
- (CS) = 標號所在的段地址 (IP) = 標號所在的偏移地址
CALL FAR PTR 標號
相當於
PUSH CS
PUSH IP
JMP FAR PTR 標號
轉移地址在暫存器中的 CALL 指令
指令格式
CALL 16位暫存器
功能
(SP) = (SP) - 2
((SS)*16+(SP)) = (IP)
(IP) = (16位暫存器)
相當於進行
PUSH IP
JMP 16位暫存器
轉移地址在記憶體中的 CALL 指令
- CALL WORD PTR 記憶體單元地址
相當於 :PUSH IP
和JMP WORD PTR 記憶體單元地址
- CALL DWORD PTR 記憶體單元地址
相當於 :PUSH CS
、PUSH IP
和JMP DWORD PTR 記憶體單元地址
返回指令 RET 和 RETF
RET 指令 | RETF 指令 | |
---|---|---|
功能 | 用棧中的資料,修改 IP 的內容,從而實現近轉移 | 用棧中的資料,修改 CS 和 IP 的內容,從而實現遠轉移 |
相當於 | POP IP | POP IP POP CS |
RET (字面值 n)
含義
POP IP
ADD SP,N
為 CALL 和 RET 指令設定棧
不定義棧段區時使用 CALL 和 RET 指令,使用的未經定義與分配的記憶體空間作為棧,程式碼很危險,所以一定要提前定義宣告棧段區
子程式
根據提供的引數處理一定的事務,處理後,將結果(返回值) 提供給呼叫者。
用暫存器來儲存引數和結果是最常使用的方法
適用於引數和返回值不多的情況下
用記憶體單元批次傳遞資料
- 將批次資料放到記憶體中,然後將它們所在記憶體空間的首地址放在暫存器中,傳遞給需要的子程式
- 對於具有批次資料的返回結果,也可用同樣的方法
用棧批次傳遞引數
- 由呼叫者將需要傳遞給子程式的引數壓入棧中,子程式從棧中去的引數