第二个条件语句不在汇编中工作

时间:2015-06-11 18:05:13

标签: assembly conditional masm irvine32

嘿伙计们,所以我在上课时遇到了这个问题。所以问题是在一个范围内添加一个数组的总和。我遇到的问题是我无法使第二个条件语句起作用,跳到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

1 个答案:

答案 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