3

変数を .data の下で宣言すると、それらはグローバル変数と見なされます。ローカルで宣言するにはどうすればよいですか

@paulメモリを割り当てることはできますが、どのようにタイプキャストできますか(signedおよびunsigned intなど)

4

1 に答える 1

4

アセンブリ コードでのローカル変数の宣言はアセンブラーに依存し、そのような宣言をまったくサポートしていない場合があります。

通常、ローカル変数は、スタック ポインターを移動 (デクリメント) することによって割り当てられます。スタック ポインターを進めてスタックに書き込むプッシュ命令を使用すると、スタック上のローカル変数の割り当てと初期化を融合できます。この例:

; input: eax = some integer >= 1
; output: eax = factorial of the integer
; used registers: ebx, eflags
factorial:
cmp   eax, 1
je    factorial_end
push  eax ; created a local variable on the stack
dec   eax
call  factorial
pop   ebx ; destroyed a local variable on the stack
mul   ebx
factorial_end:
ret

署名付き、署名なし、キャストに関しては、アセンブリにはそのようなものはありません。CPU は、ユーザーが指示したことを正確に実行します。入力や出力を解釈するのではなく、その解釈を行うのはプログラマーです。DIVしたがって、2 つの整数を符号なしで除算したい場合は、整数の値で実行し、符号付き除算を行いたい場合は、IDIV命令で同じことを行います。IDIV符号付き整数 (またはDIV符号付き整数の場合)、CPU は喜んでそれを行い、間違った結果 (または除算オーバーフロー例外) が問題になります。幸いなことに、符号なし整数と 2 の補数の符号付き整数の加算、減算、および乗算は、両方の種類の整数に対して CPU によって同じ方法で行われるため、種類ごとに適切な命令を選択するなどの特別なことを行う必要はありません。通常、符号付き整数と符号なし整数の間で異なるのは、除算と比較だけです。ただし、この違いはコード内で明示的に処理します。

于 2013-01-28T17:02:24.667 に答える