をアセンブラにCのコードを翻訳:アセンブラ&C - 私はCで次のプログラムを書くの本を読んで、アセンブラコードに、この関数の呼び出しをconvet
int *p; /* pointer to integer */
int foo (int n, int *q) {}
/* function get int and pointer to int, returns int */
/* Now, let's call the function: */
*p = foo (*p, p);
それに変換:
MOV EBX, [P]
PUSH EBX
PUSH DWORD [EBX]
CALL foo
MOV EBX, [P]
MOV [EBX], EAX
ADD ESP, 8
それが正しいか、なぜ私はそれを理解できるように、私は、理解していなかったはずが、このようなコード:Pがあるので
MOV EBX, P ;; **CHANGE**
PUSH EBX
PUSH DWORD [EBX]
CALL foo
MOV EBX, P ;; **CHANGE**
MOV [EBX], EAX
ADD ESP, 8
とそのポインタ。本書のようにMOV EBX, [P]
を実行すると、整数である(アドレスではない)。PUSH DWORD [EBX]
を実行すると、私たちは不規則な命令を得る。
どこが間違っていますか?
Pがラベルであることをどのように理解していますか? 'int * p;と書いてあります。/*整数へのポインタ*/'あなたはあなたの答えを広げることができますか? Thanks –
@Adam:アセンブリ言語は実際には "変数"を持たないので、 'P'はラベルです。レジスタとメモリがあります。いずれかが値を保持することができます。ただし、メモリを使用する場合は、値を格納する場所を知る必要があります。つまり、スタックポインタからのオフセット(ローカル変数の場合)、ラベル(スタティック/グローバルの場合)、または絶対アドレス(ふかふかしている場合)が必要です。 – cHao
私が正しく覚えていれば、masmは 'mov ebx、p'を' mov ebx、[p] 'と解釈します。' p'のアドレスを望むなら 'mov ebx、offset p' –