アプリ版:「スタンプのみでお礼する」機能のリリースについて

ニーモニックコードを使って割り算したいのですが

DIVを使わずに
割り算はできるのですか?
引き算をうまく使える気はするのですが思いつかないです。
使っていいコードは
ADD,SUB,INC,DEC,ANDI,ORI,AND,OR,EOR,LSL,LSR,ASR,IN,OUT,RJMP,JMP,BREQ,CP,NOP,LDIです。
また、RJMPとJMPの違いも教えてください。

A 回答 (5件)

人間が筆算で行う場合も引き算しか使いませんね。

(厳密にいえば10進数の除算の場合は乗算も使ってますが・・・)
ビットシフト命令を使えばNo4の回答のようなループも必要ありません。
筆算でも数字のシフトは行ってますし、アセンブラでもやり方は同じです。
人間の脳は2進数に慣れてないからわからないかな。

RJMPはリラティブジャンプ (相対ジャンプ)で現在位置から±いくつジャンプという小さなジャンプです。移動距離に制限があります。
JMPは絶対ジャンプで、位置を指定して一気に遠くまでジャンプできます。

RJMPの方がプログラムメモリも少なく実行速度も速いため、ループ処理などの移動距離が少なく回数の多いジャンプに使用するとメリットがあります。
    • good
    • 0

割り算を加減算で表現すると


6 / 2 = 3
6 = 2 * 3
6 - 2*3 = 0
6 - (2+2+2) = 0
(((6-2)-2)-2) = 0

つまり A ÷ B の商は
「A から B を引く」を「A が 0 になる」まで繰り返し実行した回数
で求めることができます。

AVR の命令セットならば、以下を用いればプログラムできるでしょう。
* 初期設定に LDI
* 引き算は SUB
* 回数の勘定は INC
* 繰り返しは CP,BREQ,RJMP

余裕があるなら、負数とか剰余とかも考慮してみてください。
    • good
    • 0

No.1が解決できたらインストラクションセットはこちらにあります。


http://www.avr.jp/user/DS/PDF/AVRinst.pdf

AVR専用ライブラリ。参考まで。
http://elm-chan.org/cc.html
    • good
    • 0

あと、ニーモニックは、CPUやアセンブラによって違うものです。


例え同じ「SUB」が使われていたとしても、その引数とか制限とかフラグの変化とかが違ってきます。

どのCPUのどんなアセンブラなのか、書くようにしましょう
    • good
    • 0

では、まず、


「引き算をうまく使って割り算の計算をする方法」
を日本語で書いてみましょう。

プログラムを作るのはその後です。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!