2016-05-06 150 views
0

我對彙編語言相當陌生,我試圖弄清楚這個程序。只是想知道我是否與該計劃有關。我如何糾正這個程序?彙編語言x86 Irvine32

編寫一個計算字節數組中所有元素總和的循環。打印結果。一些提示:將數組的大小加載到適當的寄存器中。加載數組當前元素的偏移量,並在循環的每次迭代中相應地更改它。

這是我到目前爲止有:

INCLUDE Irvine32.inc 

.data 
    val1 BYTE 1,2,3 
    counter = 0 
.code 

main PROC 

    mov ax, 0 

    mov ax, (LENGTHOF val1) 
    mov ax, OFFSET Counter 
    movzx ecx,ax 
L1: 
    add eax, val1[ecx] 
    inc eax 

loop L1 

    Call WriteDec 

exit 
END PROC 
    end main 
+1

_「我該如何糾正這個問題ogram?「_它以什麼方式不按預期工作? – Michael

回答

2

你在你的代碼的幾個錯誤:在下面的順序反覆設置的斧頭,這是相當無用:

mov ax, 0       ; you set ax to 0 
mov ax, (LENGTHOF val1)   ; you set ax to 3 
mov ax, OFFSET Counter    ; you set ax to an address (and try to use a 16-bit register for a 32-bit address 

然後你將此偏移量添加到另一偏移量中

movzx ecx,ax 
L1: 
    add eax, val1[ecx]    ; add offset(val1)[offset(Counter)] to offset(Counter) 

肯定的是,這會給你一個內存錯誤,因爲地址可能在任何地方。然後你增加與

inc eax       ; you probably confused this with a counter/index register 

這個偏移之後,你使用ECX,你擺在那裏通過movzx ecx, ax作爲指數ECX在LOOP指令

loop L1       ; decrements ECX and loops if ECX != 0 

後,這個偏移修復所有這些錯誤,代碼可能看起來像這樣:

INCLUDE Irvine32.inc  
.data 
    val1 BYTE 1,2,3 
    counter = 0 
.code 
main:  
    xor eax, eax      ; 32-bit register for the sum 
    xor edx, edx      ; 32-bit register for the counter/index 
    mov ecx, LENGTHOF val1   ; number of entries in fixed size array in ECX as maximum limit 
L1: 
    movsx ebx, byte ptr val1[edx] ; extend BYTE at offset val1 + EDX to 32-bit 
    add eax, ebx      ; add extended BYTE value to accumulator 
    inc edx       ; increase index in EDX 
loop L1       ; decreases ECX and jumps if not zero 

    Call WriteDec     ; I assume this prints EAX 
    exit 
end main 
+0

** add eax,val1 [edx]; val1 + EDX的偏移**這不是一個無效的指令操作數嗎?我覺得這就是爲什麼我有這個問題。 –

+0

是的。你是對的,我忘了數組是BYTE大小。我修改了代碼以反映這一點。在這種情況下,'MOVSX'從存儲器移動8位到一個32位寄存器(帶符號)。 – zx485

+0

如果您使用'edx/cmp edx,LENGTHOF val1/jle'循環,則可以避免破壞通常被調用保存的寄存器('ebx')。這使ecx成爲movsx的一個劃痕。或者你可以以相反的順序訪問數組,所以你仍然可以使用十進制分支循環。 (儘管你會使用'val1 - 1 [edx]',因爲你的元素爲0..len-1,而不是1..len)。或者你甚至可以用'-LENGTHOF val1'開始的計數器循環,計數到零。從'val1 + LENGTHOF val1 [edx]'加載或者其他東西。 –