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