2016-04-03 10 views
0
section .data 

    intArray dw 100,90,80,70,60 

    twoNums db ' %d %d ',0,10 

num dw 10 
numIs db ' %d ',10,0 


hello : db 'hello',10,0 


section .text 


global main 
extern printf 


main : 


mov ebx,intArray 

mov esi,0 



arrayTravel: 

movzx eax,word[intArray+esi] 

movzx ebx,word[intArray+esi+2] 



push ebx 

push eax 

push twoNums 

call printf 

add esp,12 



sub eax,ebx 

push eax 

push numIs 

call printf 

add esp,8 



ret 

結果ではなく、あなたがprintfそれがEAXに印刷された文字の数を返すを呼び出すと、私はトンが、この場合には、そのから12減算90を-78なぜ減算結果が間違っていますか?アセンブリのx86

答えて

1

を与え、あなたは-78を得る10でなければなりません。

呼び出した関数がレジスタ内の値を変更しないと仮定することはできません。特にEAXを保存する必要があります。呼び出し規約では、保持されているレジスタと保持されていないレジスタを定義します。

+0

私はadd espに、12はadd espに、4は両方のregにpopを使用しました。うまく動作します。どうもありがとう。 – matheromqq

+1

@matheromqqあなたの修正がこの場合にはうまくいくかもしれませんが、一般的にはそうしないでしょう。ここで、関数のパラメータ(値渡し)は、関数に渡すためにスタックにコピーされます。ただし、呼び出し規約に別途指示がない限り、呼び出された関数はこれらのコピーを変更する権利があります。したがって、呼び出し側の関数が制御する場所に値を保持する必要があります。 (保存された)レジスタ、スタック、メモリなどのような他のレジスタに保存することができます。一方、あなたが行っているように見えるように、レジスタが保持されていないと仮定すれば、あなたは人生をもっと難しくしています! –

関連する問題