我想在内存中添加两个值。我必须将A-J的字母存储在100到110的存储位置中,我必须一步存储两个字母,例如AH = A Al = B 并增加Bx +2。帮助:)这是我的代码我不认为这是运作良好。我在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
谢谢。
答案 0 :(得分:0)
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