2016-11-15 8 views
1

私は配列をとり、その中のすべての値を追加しようとしています。残念なことに私の場合、次のコードがビルドされても、出力は私が期待している値を返しません。例えば配列の値を追加する際の問題x86

、私はそれを実行したときに、私は

-2112902102

と私は

-1280521519

Iを得た別の時間を持って1時間それには何らかの論理があると仮定していますが、それはeではありませんxactly私を助ける。

INCLUDE Irvine32.inc 


.386 
.stack 4096 
ExitProcess proto,dwExitCode:dword 

.data 
array SBYTE 26, -81, -104, -57 
total_sum SWORD ? 

.code 
main proc 

mov esi, OFFSET array 
mov ecx, LENGTHOF array 
mov total_sum, 0 
mov ebp,0 

L1: 
add ebp, [esi] 
inc esi 
loop L1 

mov edx, ebp 
call WriteInt 
invoke ExitProcess,0 

main endp 
end main 

そして、はい、私はtotal_sumは、この時点では何もしていないことを知っているが、私は最初total_sumを実装する前に残りの部分を把握したいです。

+2

コードを実行したり、レジスタなどを調べたりするためのデバッガがありませんか? –

+0

はい、あります。しかし、私はいくつかのわずかな問題を今考え出している。 –

+1

自分自身に質問してください。 '[esi]'から 'ebp 'に追加する命令の読み込み量はいくらですか?ヒント:それは1バイトではありません... – twalberg

答えて

1

ヒントとして、問題はバイトの代わりにdwordを追加することです。簡単な解決策は、合計する前にバイトを一時レジスタに符号拡張することです。あなたがeaxを使用するので、mov eax, ebpmov edx, ebpを変更する必要がある印刷するため

movsx edx, byte ptr [esi] 
add ebp, edx 

そしてもちろん:付き

add ebp, [esi] 

:それはこれを置き換えるです。あるいは、それを使って直接合計することもできます。

+0

私のエラー(+1)を指してくれた方が、私よりずっと優れていて、効率的で、ありがとうございました。 –

+0

ある時点で、私はスタックを使う必要があるかどうか考えていましたが、それは問題をもたらしていました。私が私の元の考え方から遠く離れていないことを私に示してくれてありがとう。 –

関連する問題