0

我想在内存中添加两个值。我必须将 AJ 的字母存储在 100 到 110 的内存位置,并且我必须一步存储两个字母,例如 AH=A Al=B 并增加 Bx +2。帮助:) 这是我的代码,我认为它运行得不好。我在鸸鹋 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。这行得通(并且可能会比这对增量快两倍),因为您不希望它们中的任何一个溢出。同样的想法也适用于mov al,40hand 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
于 2012-10-21T19:03:52.193 回答