我有一個陣列,我必須在其中添加所有兩位數字,具有 2 位數字排序的部分有效,但我似乎無法從我的陣列中取出下一個數字,它總是取第一個
.386
.model flat,stdcall
.stack 4096
ExitProcess proto,dwExitCode:dword
.data
skaic DWORD 15,20,12,11,15151515
suma DWORD ?
.code
main proc
mov ecx, 0
l1:
mov ebx,skaic
add ebx,ecx
cmp ebx,15151515
je endl1
add ecx, 4
mov eax,ebx
cmp eax,9
jng l1
add suma, eax
mov eax, 0
mov ebx, 0
jmp l1
endl1:
invoke ExitProcess,0
main endp
end main
在此處輸入影像描述
uj5u.com熱心網友回復:
由于這是 MASM 代碼,因此該mov ebx, skaic指令正在檢索陣列的第一個元素。然而,看到 ECX 暫存器的加法以及如何在整個回圈中將 ECX 提高 4,清楚地表明您希望 EBX 同時包含一個地址。不能同時兩個!
好的解決方案是維護一個簡單的指標,該指標從指向陣列的第一個元素開始,并且在回圈的每次迭代中遞增 4。
mov ebx, OFFSET skaic ; Pointing at the first element
T1:
mov eax, [ebx] ; Retrieving the current element
add ebx, 4 ; Preparing for the next element
cmp eax, 15151515 ; Is it the array terminator
je endT1 ; Yes
cmp eax, 10
jb T1 ; Has fewer than 2 digits, so don't add
add suma, eax
jmp T1
endT1:
提示1:不要使用像l1. 這些很難讀!T1在非描述性標簽名稱中,提及已經是一個更好的選擇...
提示 2:最好也插入一些少于 2 位的陣列元素。如果所有陣列元素都有 2 位數字,您將如何驗證“數字排序有效”?
來自評論:
...是否有可能以某種方式獲取陣列的最后一位?因為我想將 eax 與陣列的最后一位和 je endloop1 進行比較
因為skaic陣列包含 5 個雙字,所以最后一個元素(在這方面我們不討論“數字”)位于skaic 16. 偏移量為 16,因為每 4 個位元組中有 4 個元素位于最后一個元素之前。
在代碼中:cmp eax, [skaic 16] je endT1.
或者,因為suma變數直接在記憶體中跟隨skaic陣列,所以最后一個元素也在suma - 4.
在代碼中:cmp eax, [suma - 4] je endT1.
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/515473.html
