Второе условное утверждение не работает в сборке

Привет, ребята, так что у меня проблемы с этой проблемой для класса. Таким образом, проблема состоит в том, чтобы добавить сумму массива в диапазоне. У меня проблема в том, что я не могу заставить работать второе условное утверждение, переходя на 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 ответ

Существует ошибка в способе обработки вашего 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 значение до 0.

Избыточность происходит от таких конструкций:

    jg L2             ; jump to L2
    jl L4             ; else jump to L4
L2:

Здесь, если результат больше нуля, вы попадаете на 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
Другие вопросы по тегам