80x86 は「リトル エンディアン」です。つまり、AL の値は最下位アドレスに格納され、AH の値は最上位アドレスに格納されます。これは、コードが「BADCFEHGJI」を実行することを意味します。
AL と AH が最初から異なる場合。ループ内で両方をインクリメントすると、ループの最後で同じ値になることはなく、プログラムは永久に(またはクラッシュするまで、どちらか早い方で)実行されます。
AL と AH を別々にインクリメントするのではなく、あなたがすることができますadd ax,0x0101
。どちらもオーバーフローすることを想定していないため、これは機能します (そして、おそらくインクリメントのペアの 2 倍の速さになります)。同じ考え方がmov al,40h
andmov 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