2015-06-11 4 views
0

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

К сожалению. Я использую Microsoft (MASM), поэтому я считаю, что это противоположно для cmp. Кроме того, извините, позвольте мне обновить код. Спасибо – Bryan

+0

Из того, что я собрал cmp A, B переведен на A-B, Ex: http: //stackoverflow.com/questions/9617877/assembly-jg-jnle-jl-jnge-after-cmp – Bryan

+0

Да, извините что. Вы правы в 'cmp'. Однако можно использовать объяснение того, что не работает. – lurker

ответ

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 
+0

AHHH. Спасибо чувак! Я ценю объяснение и своевременный ответ. – Bryan

Смежные вопросы