集合,在数组中移动



我有一个数组,我必须将所有两位数相加,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

相关内容

  • 没有找到相关文章

最新更新