0

メモリに2つの値を追加したい。AJ の文字を 100 から 110 のメモリ位置に保存する必要があり、たとえば AH=A Al=B で Bx +2 を増やすために、2 つの文字を 1 ステップで保存する必要があります。ヘルプ:)これが私のコードです。うまく機能しているとは思いません。私はEmu 8086で働いています。

 MOV AX, data
MOV DS, AX

MOV Ah,40h 

Mov Al,41h

MOV BX, 0100h

AGAIN:  
MOV [BX], Ax
inc Ah

Inc Al

add Bx,2

cmp Ah, Al

JNE AGAIN

ありがとうございました。

4

1 に答える 1

0

80x86 は「リトル エンディアン」です。つまり、AL の値は最下位アドレスに格納され、AH の値は最上位アドレスに格納されます。これは、コードが「BADCFEHGJI」を実行することを意味します。

AL と AH が最初から異なる場合。ループ内で両方をインクリメントすると、ループの最後で同じ値になることはなく、プログラムは永久に(またはクラッシュするまで、どちらか早い方で)実行されます。

AL と AH を別々にインクリメントするのではなく、あなたがすることができますadd ax,0x0101。どちらもオーバーフローすることを想定していないため、これは機能します (そして、おそらくインクリメントのペアの 2 倍の速さになります)。同じ考え方がmov al,40handmov 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
于 2012-10-21T19:03:52.193 に答える