PUSH/POP 不平衡、迴圈計數器成負值、段切換失誤。編碼時記錄假想值,勿信記憶。原碼:84 位元組,語法正確、執行無誤。關鍵在 DX 反覆載入 03F8H~03FDH,高位 DH 不變,僅 DL 變化。每次改 DX 需 3 位元組,改 DL 仅 2 位元組;共 11 次載入,首次必須載 DX,其餘 10 次省 10 位元組。INC DX 更仅 1 位元組。合併重複輸出指令、合併 MOV AL,0E08H 等技巧,最終壓縮至 66 位元組(減近 20%)、速度更快。藝術要求絲毫不苟,唯訓練有素、追求完美者能為。
優化後核心片段:
MOV DH, 3 ; DH 固定為 3
MOV DL, 0FDH ; 輸出埠
...
MOV DL, 0F8H ; LSB 速度
...
INC DX ; MSB 速度
SUB AL, AL
...
MOV DL, 0FBH ; 行控制
MOV AL, DH ; AL=3 (DH 值)
...
INC DX ; 通訊控制
...
MOV DL, 0F9H ; 中斷有效
SUB AL, AL
CSNDA: OUT DX, AL ; 共用輸出指令
...
MOV DL, 0FCH ; 通訊控制
MOV AX, 0E08H ; 合併:暫停中斷 + 顯示屬性
OUT DX, AL
...
JMP CSNDA ; 循環回共用出口
目標:將 16×16 點陣字形送上 Hercules 640×400 四區交錯顯存。原迴路 10 行,關鍵在區界檢測:
ADD DI, 1FFEH ; 跨區偏移
JNS CDSP2 ; 未溢位繼續
ADD DI, 8050H ; 溢位換區換行
常規寫法需 CMP DI,8000H / JB / SUB DI,8000H,多 4 位元組指令 + 4 時鐘週期 × 16 次 = 64 週期損失。全螢幕 1000 字累積可觀。取消迴路展開雖快 272 週期但增 130 位元組;改用 JS 分支僅增 2 位元組卻快 36 週期;預載 BX=1FFEH, DX=8050H 再 ADD DI,BX / ADD DI,DX,每次快 2 週期,展開後空間增 94 位元組、快 304 週期,全螢幕 8MHz 下加速 1/25 秒。
迴路鐵律:極力避免 PUSH/POP(27 週期)、緩衝區存取;善用暫存器、常數即時置入;變數值需模組設計階段妥善安排。空間換時間是否值得,視時效嚴格度而定。