80x86是「little-endian」,這意味着AL中的值將存儲在最低地址處,而AH中的值將存儲在最高地址中。這意味着你的代碼會做「BADCFEHGJI」。
如果AL和AH開始不同;並且你在循環中增加它們,那麼它們將永遠不會在循環結束時具有相同的值,並且程序將永遠運行(或者直到它崩潰,以先到者爲準)。
而不是分別遞增AL和AH;你可以做add ax,0x0101
。這是有效的(並且可能會比這兩對增量快兩倍),因爲你並不期待它們中的任何一個溢出。同樣的想法適用於mov al,40h
和mov ah,41h
,這可能是單個mov ax,4140h
(爲了便於理解,可能應該使用mov ax,('B'<< 8) | 'A'
)。
最後,有一個很老的優化稱爲「循環展開」。這個想法是通過在循環內部做更多的事情來減少循環的開銷。在你的情況下,因爲循環太小(並且一切都是恆定的),所以很容易「完全展開」並且根本沒有任何循環。例如:
mov ax, data
mov ds, ax
mov word [0x0100], ('B'<< 8) | 'A'
mov word [0x0102], ('D'<< 8) | 'C'
mov word [0x0104], ('F'<< 8) | 'E'
mov word [0x0106], ('H'<< 8) | 'G'
mov word [0x0108], ('J'<< 8) | 'I'
ret
謝謝,我現在就試試。 – Bojan