• ベストアンサー

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

アセンブラで変数から即値を引く場合(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

  • アセンブラの数値比較

    Z80のアセンブラで数値比較を行うにはどのような記述をすればよいのでしょうか? 例)変数に入っている値「10」と変数に入っている値「20」を比較するような場合 よろしくお願いいたします。

  • 補数を利用した引き算について

    こんにちは。 『2進数で 111 - 010 を計算をせよ。』 という問題があります。 つまり10進数でいう所の 7 - 2 = 5 の計算をします。 補数を利用すると引き算が足し算ででき、演算が簡単になることを 本は説明しようとしてるのですが、腑に落ちない点があります。 解説では --------------------------------- 引く数 010 の補数を求めると 101 なので  111 +101 -------- 1101  ↓  101 よって桁上がりを無視した 101 が答え --------------------------------- との事ですが疑問に思うことがいくつかあります。 I. 上記の計算では3ビットであることが前提になっています。 7 - 2 = 5 をしたいわけですから、そうすると  111 ←符号なしの表現 ( 7 ) +101 ←符号付きの表現 ( -2 ) -------- 1101  ↓  101 ←符号なしの表現 ( 5 ) となり、符号なしと符号付きの数値を混ざってしまうが、良いのでしょうか? また、この説明の仕方だと答えが 0~7 になる答えしか出せません。つまり引く数の方が大きいと計算できません。 私は補数を使うのであれば正の値・負の値、全て符号付きの値でなければいけないと思っていたので、 もし私が説明するのであれば全て符号付きにし、そして符号付きで7を表せるようにするために4ビットにして  0111 ←符号付き( 7 ) +1110 ←符号付き( -2 ) ---------- 10101  ↓  0101 ←符号付き( 5 ) とするのであれば納得できます。 答えの範囲も -8~7 と負の値も許容できます。 II. 実際には 本のように引く数だけを補数にして足し算をして答えを求めているのか、 それとも私のように正の値・負の値、ともに符号付きの表現にして足し算をしているのか、 もしくは、いずれとも違うのか、どうなのでしょうか? また、参考文献などがありましたらご紹介お願いします。 以上ですがよろしくお願いします。

  • 65816アセンブラでの質問

    現在65816アセンブラを独学で勉強しています。 そこで皆様にお聞きしたいのですが… 例えば AD E0 11 LDA で11E0の値を読み込んで その値が260以上だった場合「Xにジャンプ」、 260以下だった場合「Yにジャンプ」 という命令はどのようにしたら宜しいですか?

  • 関数電卓 EL-509F-X fx-993ES

    関数電卓 シャープ EL-509F-X、カシオ fx-993ESで直前に計算した結果を符号反転して、反転した値を次の式に利用したいです。 例えば10×5=50 50を符号反転-50 -50×2=-100 のような感じです。 今まではカシオのfx-690v、fx-991sを使用していて直前に計算した結果、つまり=を押して出た値に+/-を押せば符号反転が出来ました。 10×5=、+/-、-50×2=というキー操作で-100になっていました。 どちらを使用されている方でも良いので教えて下さい。

  • GASアセンブラのテストプログラムの作り方について

    現在、アセンブラのテストプログラムの作り方に困っています。 入力された値を関数palindへ渡し、結果を出力する様にしたいのですが、考え方がよく解りません。 関数を呼び出すには、       movl 引数, %eax       pushl %eax       call 渡す関数の名前       popl %eax とすると思うのですが、これだけでは結果を戻しただけだになると思います。 この後結果を出力するにはどのようにしたら良いでしょうか? 宜しくお願いしますm(_ _)m ・回文を作るアセンブラの関数(palind.s) 例えば8と入力した場合に2進数(1000)の回文(上から読んでも下から読んでも同じもの)、10000001と00011000を作ります。(abcd)→(abcddcba),(dcbaabcd) 答えは2個あるので、入力とは別の変数を持ってきて、その変数の値によってどちらかを返すようにします。 (2個の答えを出すには変数を変えて呼び出せば問題ないと思います)

  • Δxの値が大きいほうについて

    例えばx(t)と言う変数があり、 Δxと言うとx差、もしくは変化量を表しますが、 何か計算をしてΔx=0.5と言う値と Δx=-0.8と言う値が出たとします。 この場合、最大であるΔxを選択するときは負の値でも 差の大きさなので後者のΔxの方が値を選択するのは正解でしょうか? 初歩的な質問で申し訳ありませんがよろしくお願いします。

  • 数学 ルートi の値について

    √-1と言う結果が出た場合、どのような値にすればいいのでしょうか? 例えば √1と√-1ではどちらが大きいのか? 比でで表すと、何対何? 1:√i ←これではだめです(^_^;) √-1と言う値は、結果として影響を与える数字ではないから「0」としていいのか? 符号を消して「1」として扱うか? 結果としてでているので相殺できません。 困ってます(^_^;)

  • 剰余の値の符号

    表計算ソフトの関数で「剰余の値は常に除数と同じ符号をもつ」とありました。そこで疑問がわきました。 3÷(-2)の答えを整数とした場合、 “-1余り1”ではなく“-2余り-1”となることになりますが 本当でしょうか?

  • 数学2 式の値

    こんばんはー。 まず問題を載せておきます。 問題 X=√3のとき、f(x)=x^100-3x^98+x+2の値を求めよ で、いきなり√3を代入しても計算は不可能ですねw 参考書には、 1,解とする2次方程式を作る 2,割り算を実行して除法の原理の形に変形させる と書いてあります。 まず1から始めますと、 x=√3 X^2=3 X^2-3=0 こういうことですね。 で、2が僕のわからないところなんですが、 f(x)÷(x^2-3)を実行するということですよね? そうすると、 f(x)=(x^2 - 3) * x^98 + x+2 という形になるそうなんですが、どう計算したらこのような 式になるのでしょうか?それに100乗はどこに行ったのか? 確かにこの式は除法の原理の形、 つまり割る式*商+余りの形になっていますが、よくわかりません。 回答待ってます。

  • ある二次方程式の値を求めたいです。

    例えば、7.77x^2 + 7.77x という式があったとき、式の値が400以上となる最小のxの値 を整数で知りたいのですがどのように計算すればいいんでしょうか? 数学は全然勉強しなかったのでもしかすると簡単な調べ方があるかもしれませんが 用語も分からないのであんまり調べようがありませんでした。 どなたかお教え頂けるとありがたいです。 ちなみに、分からないながらググって 7.77x^2 + 7.77x = 400 としてみて因数分解とやらをやってみましたが答えが出せませんでした。 一番近い答えで -6.6, 7.8 (-7.8, 6.6) という数字は出ましたが、期待するものではありません。 こうして近い値を出して間をとって「7」を答えとするのがこの場合正しいんでしょうか? もしそれが正しかった場合、どのように計算するのが効率が良いのかもお教え頂けるとありがたいです。 例えば答えの出ない因数分解で、一番答えに近い値を出す公式、なんかがあるのでは?と予想しています。 よろしくおねがいいたします。

専門家に質問してみよう