有多種方法來填充數組,並且您的代碼幾乎可以工作。一種方法是使用反間接地址,這樣你就不必修改目標和源數組指針每次循環:
ExitProcess PROTO
.data
warray WORD 1,2,3,4
darray DWORD 4 dup (?) ; 4 elements
.code
main PROC
mov edi, OFFSET warray
mov esi, OFFSET darray
xor ecx, ecx ; clear counter
L1:
mov ax, [edi + ecx * 2] ; get number from warray
movzx [esi + ecx * 4], ax ; move number to darray
inc ecx ; increment counter
cmp ecx, LENGTHOF warray
jne L1
call ExitProcess
main ENDP
END
當然這個代碼可以修改向後填補了數組可能保存情侶像你這樣的字節可能意味着你的原始代碼。這裏是具有更緊湊的循環另一種方式:
ExitProcess PROTO
.data
warray WORD 1,2,3,4
darray DWORD 4 dup (?) ; 4 elements
.code
main PROC
mov edi, OFFSET warray
mov esi, OFFSET darray
mov ecx, LENGTHOF warray - 1 ; start from end of array
L1:
mov ax, [edi + ecx * 2] ; get number from warray
movzx [esi + ecx * 4], ax ; move number to darray
loop L1
; get and set element zero separately because loop terminates on ecx = 0:
mov ax, [edi]
movzx [esi], ax
call ExitProcess
main ENDP
END
你也應該注意到,與同類型的數組時,您可以非常有效地做簡單的複製使用重複前綴的指令就像MOVSD:
ExitProcess PROTO
.data
array1 DWORD 1,2,3,4
array2 DWORD 4 dup (?)
.code
main PROC
mov esi, OFFSET array1 ; source pointer in esi
mov edi, OFFSET array2 ; destination in edi
mov ecx, LENGTHOF array1 ; number of dwords to copy
cld ; clear direction flag so that pointers are increasing
rep movsd ; copy ecx dwords
call ExitProcess
main ENDP
END
它們並不像你讓它們那樣糟糕。他們過去實施起來相當糟糕,但是在較新的體系結構(SNB +)上,它們實際上非常快。它們並不完全替代宏指令,但有一些情況下它們的表現比手寫彙編更好。 – drivingon9 2014-10-02 19:28:10
@ drivingon9完全同意你的看法。用正確的方式寫出它們(我想,這是一個荒謬的文字遊戲),他們將完成少數其他指令可以完成的任務。現在看來,字符串指令已被標記爲通常不太酷。愚蠢?確實 !但是,這就是今天的生活。 – 2014-10-02 19:36:27
丟失了編輯窗口時間。 @ drivingon9加上你的評論和我編輯我的答案。 – 2014-10-02 19:43:56