8086 彙編學習 Part 6

AlwaysBeShine發表於2024-05-03

用 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 指令的流程

  1. 將當前 IP 或 CS 和 IP 壓入棧中
  2. 轉移到標號處執行指令

CPU 執行 CALL 指令的原理

  1. (SP) = (SP) - 2 ((SS) * 16 + (SP)) = (IP)
  2. (IP) = (IP) + 16 位位移
    相當於 PUSH IPJMP NEAR PTR 標號

CALL FAR PTR 標號 實現的是段間轉移

CPU 執行 CALL FAR PTR 標號 時的操作

(SP) = (SP) - 2
((SS) * 16 + (SP)) = (CS)
(SP) = (SP) - 2
((SS) * 16 + (SP)) = (IP)
  1. (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 指令

  1. CALL WORD PTR 記憶體單元地址
    相當於 :PUSH IPJMP WORD PTR 記憶體單元地址
  2. CALL DWORD PTR 記憶體單元地址
    相當於 :PUSH CSPUSH IPJMP 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 指令,使用的未經定義與分配的記憶體空間作為棧,程式碼很危險,所以一定要提前定義宣告棧段區

子程式

根據提供的引數處理一定的事務,處理後,將結果(返回值) 提供給呼叫者。

暫存器來儲存引數和結果是最常使用的方法

適用於引數返回值不多的情況下

記憶體單元批次傳遞資料

  • 將批次資料放到記憶體中,然後將它們所在記憶體空間的首地址放在暫存器中,傳遞給需要的子程式
  • 對於具有批次資料的返回結果,也可用同樣的方法

批次傳遞引數

  • 由呼叫者將需要傳遞給子程式的引數壓入棧中,子程式從棧中去的引數

相關文章