組合器(MASM、TASM)提供高級特性,但真正的組合語言優勢在於精確控制硬體。本文聚焦機器指令層面,解析 JMP、CALL、INT、LDS/LES 及字串操作指令,為閱讀反組譯碼打下堅實基礎。
組合器自動依距離選擇編碼。支援直接/間接定址:
jmp 8E347D60 ; 直接段內跳轉
jmp ebx ; 暫存器間接,僅段內
jmp dword ptr [ebx] ; 記憶體間接段內跳轉
jmp fword ptr [00903DF0] ; 記憶體間接段間跳轉 (48 位完整位址)
DWORD PTR 取 32 位偏移,FWORD PTR 取 48 位完整位址(選擇子:偏移)。
僅支援段內直接定址,依旗標(ZF、CF、SF、OF 等)決定是否跳轉。
CALL 跳轉前將下一指令位址壓入堆疊。段內呼叫壓 32 位偏移,段間呼叫壓 48 位完整位址。對應返回指令:
RETN:段內返回,彈出 32 位RETF:段間返回,彈出 48 位RETN n/RETF n 可攜帶立即數,返回後自動調整 ESP 清除參數(以字為單位,ESP += n*2)。
關鍵洞察:CALL/RET 設計為配對使用,但無硬性綁定。可手動 PUSH 位址後 RET 實現非常規流程轉移,常用於反除錯。
保護模式下 INT n 必被作業系統攔截。執行流程:
ISR 通常涉及特權級轉換、堆疊切換。IRET 執行逆向操作:彈出 CS:EIP、彈出 EFLAGS(可能已被 ISR 修改,如 CF 表示成功與否)。同樣,IRET 可獨立用於任務切換。
從記憶體讀取 48 位完整指標(偏移在前,選擇子在後),將選擇子載入段暫存器,偏移載入指定通用暫存器。例如 LDS ESI, [addr] 將 DS 載入選擇子,ESI 載入偏移,後續可用 DS:[ESI] 存取資料。
硬體規定隱含運算元:
DS:[ESI]ES:[EDI]AL/AX/EAX使用前必須正確設定 ESI、EDI、段暫存器。每指令有三種寬度:B(位元組)、W(字)、D(雙字)。
| 指令 | 功能 | 旗標影響 |
|---|---|---|
| CMPSB/W/D | 比較來源/目的字串 | ZF=1 若相等 |
| SCASB/W/D | 掃描:AL/AX/EAX 與目的比較 | ZF |
| LODSB/W/D | 載入:來源 → AL/AX/EAX | 無 |
| STOSB/W/D | 存放:AL/AX/EAX → 目的 | 無 |
| MOVSB/W/D | 移動:來源 → 目的 | 無 |
| INSB/W/D | 從埠 (DX) 讀入目的字串 | 無 |
| OUTSB/W/D | 來源字串輸出至埠 (DX) | 無 |