あなたはあなたのコード内のいくつかのエラーがあります:あなたが繰り返しかなり無用である斧を設定し、次のシーケンスでは:
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
オフセットその後、あなたがこれを使用しますが、後
loop L1 ; decrements ECX and loops if ECX != 0
LOOP
命令にECXにインデックスとしてmovzx ecx, ax
によってそこに置かECX、オフセット増加しますこれらのエラーをすべて修正すると、コードは次のようになります。
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
_「このprを修正する方法ogram? "_どのように意図したとおりに動作しませんか? – Michael