如何在单步装配中在内存中添加两个值

时间:2012-10-21 18:02:57

标签: memory assembly

我想在内存中添加两个值。我必须将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

谢谢。

1 个答案:

答案 0 :(得分:0)

80x86是“little-endian”,这意味着AL中的值将存储在最低地址,AH中的值将存储在最高地址中。这意味着您的代码将执行“BADCFEHGJI”。

如果AL和AH开始不同;然后你在循环中增加它们,然后它们在循环结束时永远不会有相同的值,你的程序将永远运行(或直到它崩溃,以先到者为准)。

而不是单独递增AL和AH;你可以做add ax,0x0101。这有效(并且可能是这对增量的两倍),因为你不希望它们中的任何一个溢出。同样的想法也适用于mov al,40hmov 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