2012-10-21 24 views
0

我想在內存中添加兩個值。我必須將A-J的字母存儲在100到110的內存位置,我必須在一個步驟中存儲兩個字母,例如AH = A A1 = 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

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 
+0

謝謝,我現在就試試。 – Bojan

相關問題