我有一个数组,我必须将所有两位数相加,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
在此处输入图像描述
由于这是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:
Tip1:不要使用像l1
这样的标签名称。这些很难阅读!在非描述性标签名称中,提到T1
已经是一个更好的选择
Tip2:最好也插入一些少于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
。