高階語言的函式擁有區域變數、參數傳遞、返回值等機制,但在組合語言中全部需自行實現。所有暫存器與記憶體預設為全域共享,若需區域變數,必須利用堆疊框架手動管理。
EBP 為基址(EBP+8 起)存取參數RET/RETF 彈出返回位址跳轉myTransform:
push ebp ; 保存呼叫者 EBP
mov ebp, esp ; 建立堆疊框架
sub esp, 10h ; 配置區域變數空間
...
pop ebp ; 恢復 EBP
ret ; 返回
; C++: int myTransform(int nInput) { return (nInput*2+3)%7; }
mov eax, dword ptr [ebp+8] ; 取第 1 參數 nInput
lea eax, [eax+eax+3] ; eax = nInput*2+3 (LEA 技巧)
cdq ; 擴展為 64 位元被除數
mov ecx, 7
idiv ecx ; edx = 餘數
mov eax, edx ; 返回值放入 eax
push ecx ; 參數 i
call myTransform ; 呼叫
add esp, 4 ; 清理堆疊 (呼叫者清理,__cdecl)
mov dword ptr a[edx*4], eax ; 存返回值
若兩函式有共同尾部程式碼(如 for(i=0;i<n;i++) sBytes[i]<<=1;),手工合併可減少程式碼體積,降低頁面錯誤機率。但代價是可讀性與維護性大幅下降,必須在演算法已最優、功能經驗證、效能獲益顯著時才考慮。
0000:0000,256 條目,各 4 位元組(段:位移)| 類型 | 來源 | 範例 |
|---|---|---|
| 硬體中斷 | 外部裝置訊號 | 鍵盤、計時器、DMA 完成、網卡收封包 |
| 軟體中斷 | INT n 指令 | DOS 21h、BIOS 10h/13h/16h、系統呼叫 |
| 例外/陷阱 | CPU 內部事件 | 除零錯誤、分頁錯誤、除錯中斷 |
| 中斷 | 功能 | 常用子功能 |
|---|---|---|
| INT 10h | BIOS 視訊服務 | AH=00h 設定模式、AH=0Eh 輸出字元、AH=13h 顯示字串 |
| INT 13h | BIOS 磁碟服務 | AH=02h 讀扇區、AH=03h 寫扇區、AH=08h 取得磁碟參數 |
| INT 16h | BIOS 鍵盤服務 | AH=00h 讀鍵盤、AH=01h 檢查緩衝區 |
| INT 21h | DOS 系統服務 | AH=4Ch 終止程式、AH=3Dh 開檔、AH=3Fh 讀檔 |