嘿伙计们,所以我在上课时遇到了这个问题。所以问题是在一个范围内添加一个数组的总和。我遇到的问题是我无法使第二个条件语句起作用,跳到L4。我确信编码还有其他问题,所以我完全愿意知道这些问题。先谢谢你们。
; Program template
Include Irvine32.inc
.data
list DWORD 10, 20, 30, 40
ptrA SDWORD list
varj DWORD 25
vark DWORD 100
.code
main proc
mov esi, ptrA
mov ecx, LENGTHOF list
call ArraySum
call WriteDec
invoke ExitProcess,0
main endp
ArraySum Proc
push esi
push ecx
mov eax, 0
mov ebx, varj
mov edx, vark
top:
cmp [esi], ebx ; if esi > ebx
jg L2 ; jump to L2
jl L4 ; else jump to L4
L2:
cmp [esi], edx ;if esi < edx
jl L3 ; jump to L3
jg L4 ; else jump to L4
L3:
add eax, [esi] ;add the value in array into eax
add esi, TYPE DWORD ; move to next array index
loop top ; loop to top
L4:
add esi, TYPE DWORD ; move ot next array index
loop top ; loop to top
pop ecx
pop esi
ret
ArraySum endp
end main
答案 0 :(得分:1)
您处理loop
指令的方式有误,并且您有多余的冗余代码。
您当前的循环部分如下:
L3:
add eax, [esi] ;add the value in array into eax
add esi, TYPE DWORD ; move to next array index
loop top ; loop to top
L4:
add esi, TYPE DWORD ; move ot next array index
loop top ; loop to top
如果第一个loop
指令将ECX
递减为0,它将完成并且不会跳转但会跳到L4
部分。然后,loop
部分中的L4
指令会将ECX
递减到0xFFFFFFFF
,然后您将更多 更多地循环回到top
loop
指示ECX
标签继续将新的非常大的 jg L2 ; jump to L2
jl L4 ; else jump to L4
L2:
值减少为0。
冗余来自这样的结构:
L2
在这里,如果结果大于零,则落在L4
上。如果它小于零,则降落在L2
。如果它等于零,则会落到L4
。最终结果是,如果结果小于零,您真的想要转到L2
,否则会转到 jl L4
L2:
。所以这相当于:
loop
这是删除了ecx
问题的相同功能,冗余整理了一下。 (注意,这仍假设调用者已加载esi
数组长度和ArraySum Proc
push esi
push ecx
mov eax, 0
mov ebx, varj
mov edx, vark
top:
cmp [esi], ebx ; if [esi] < ebx
jl skip ; jump to skip
cmp [esi], edx ; if [esi] > edx
jg skip ; jump to skip
add eax, [esi] ; add the value in array into eax
skip:
add esi, TYPE DWORD ; move to next array index
loop top ; loop to top
pop ecx
pop esi
ret
ArraySum endp
数组地址。)
Joiner