2015-06-11 70 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

對不起。我使用的是微軟(MASM),所以我認爲它與cmp相反。另外,對不起,讓我更新代碼。謝謝 – Bryan

+0

從我收集的cmp A,B被翻譯成A - B,例如:http://stackoverflow.com/questions/9617877/assembly-jg-jnle-jl-jnge-after-cmp – Bryan

+0

是的,對不起那。你對'cmp'說得對。儘管如此,仍然可以使用對不起作用的解釋。 – lurker

回答

1

指令的處理方式有錯誤,而且你有一些冗餘代碼。

您當前的循環部分如下:

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部分。然後在L4部分的loop指令將遞減ECX0xFFFFFFFF,你會得到很多更多循環回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