• ベストアンサー

アセンブラでの即値の引き算

アセンブラで変数から即値を引く場合(ex. x - 4)は subi rt, rs, 4 とかでできますが、逆に即値から変数を引く場合(ex. 4 - x)はどうなるのでしょうか? neg rs, rs addi rt, rs, 4 みたいに符号を反転してから計算するのでしょうか? もしそうなら、C言語とかでi-4の計算は4-iより遅いということでしょうか? 同様に割り算の場合などはどうなのでしょうか? よろしくおねがいします。

質問者が選んだベストアンサー

  • ベストアンサー
  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.1

素直に4から引くコードを出すと思いますが。 ただ、命令コードには「即値から実効アドレスにある値を引く」という ものを持っているようなCPUは多分ないので、 4を適当なレジスタにロードしてから減算を行うという手順になると思います。 int dummy(int i) { int x, y; x = 4 - i; y = i - 4; return x+y; } たとえばこれを gcc (3.4.5)にコンパイルさせるとこんな感じになります。 .file "sample.c" .text .globl _dummy .def _dummy; .scl 2; .type 32; .endef _dummy: pushl %ebp movl %esp, %ebp subl $8, %esp movl $4, %eax ← 即値の4を eaxレジスタにロード subl 8(%ebp), %eax ← eaxからiを引く movl %eax, -4(%ebp) ← 結果を xに格納する movl 8(%ebp), %eax ← iの内容をeaxにロード subl $4, %eax ← eaxから4を引く movl %eax, -8(%ebp) ← 結果をyに格納する movl -8(%ebp), %eax addl -4(%ebp), %eax leave ret 割り算でも同じです。

minimax2005
質問者

お礼

回答ありがとうございます。 この場合には、ロード命令が特になくて、レジスタも即値も変数も同じようにアクセスできるようですね。 しかし、そうでない場合には即値から変数(レジスタ)を引く場合には即値をレジスタに格納する命令がひとつ余計に必要になるってことですよね?

関連するQ&A