質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
アセンブリ言語

アセンブリ言語とは、機械語を人間にわかりやすい形で記述した低水準言語です。

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

3回答

620閲覧

アセンブリ言語のJAEのEFLAGS条件に付いて

KGN_digital

総合スコア7

アセンブリ言語

アセンブリ言語とは、機械語を人間にわかりやすい形で記述した低水準言語です。

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

0クリップ

投稿2018/07/16 03:38

編集2018/07/16 03:56

前提:アセンブリ言語の条件付きジャンプ命令JAEについて。

CMP A,B JAE L1は符号なし整数で、AがBより上か等しいときに移動するところまで理解しています。
また、JAEの条件はCF=0であると知りました。

質問:A=Bのときは?

A=Bの時の挙動がわかりません。
例えば、
CMP 1010,1010をやるとします。
1010-1010を計算するわけですが、
-1010は2の補数に1を足して、0110と表現されると思います。
1010+0110=(1)0000で、CF=1になると思います。
このとき、なぜJLEで移動できるのでしょうか?

ZF=1 | CF=0

でなくていいのでしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

どのCPU、ってことではないんです。

だったら、回答不能です。アセンブラは、CPUに強く依存します。昔、良く言われたのが、Intel系は、movでフラグが変化しないが、Motorola系は、変化する、と。
(結構、引っ掛かる人が居た)

特定のCPUは想定しなくても、アセンブラの仕様がある筈なので、まず確認しましょう。

問題の "JAE L1" の動作ですが、検索してみると、アセンブラの基礎 3なんてページがありました。ここの解説では、CF=0 で ジャンプのようです。従って、A=B でもジャンプとなります。

なお、アセンブラのニーモニックは、略号である事が多く、
jz ... Jump Zero, jnz .... Jump non Zero .... etc.
JAEは知らなかったのですが、どうも Jump Above Equ... のようです。
(より大きく、または、同じ場合に Jump)

投稿2018/07/16 07:46

pepperleaf

総合スコア6383

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

CPUは何? と聞こうと思ったら「どのCPU、ってことではない」ですか…。
これは少々困るのですが、キャリーフラグの扱いはCPUによって異なります。

1010+0110=(1)0000で、CF=1になると思います。

そうなるCPUもあります。具体例をあげればPICと6502とARMがそうです。
そのようなCPUであれば、

JAEの条件はCF=0であると知りました。

こうはなりません。ARMで「符号なし整数で、AがBより上か等しいときに移動する」を意味する命令はBHSですがこの条件はCF=1です。
逆にJAEの条件がCF=0であるようなCPUは、減算命令のとき「A-BはA+(-B)として計算」するのは確かですが、その上でそのキャリーをビット反転してからキャリーフラグに入れています。
あとは入ってくるキャリーもビット反転が必要だったかな。ちょっとこの辺反転が多くてこんがらがるのですが。

あと、

-1010は2の補数に1を足して、0110

違います。1の補数に1を足して、2の補数である0110になります。

投稿2018/07/16 05:23

ikadzuchi

総合スコア3047

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

jae は単なる条件ジャンプ命令で、それ自身が演算はしません

cmp A,B
の命令では、A-Bの結果がフラグに反映されます
あくまで、 A-B であって、A+(-B)ではありません。

投稿2018/07/16 03:48

y_waiwai

総合スコア87774

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

KGN_digital

2018/07/16 03:55

CPUは引き算ができないと思います。 そのため、A-BはA+(-B)として計算されると思うのですが・・・。 A-Bはどうやって計算されているのか教えてください。
y_waiwai

2018/07/16 03:59

足し算しかできないPICのよーなCPUもありますが、 インテル8080の時代から引き算はふつーに実装されてます あなたは引き算の計算するときはA+(-B)としているんでしょうか
KGN_digital

2018/07/16 04:05

それでは「引き算したときにCF=0になる」条件を教えてください。
y_waiwai

2018/07/16 04:11 編集

A>=Bのとき。 CPUのデータシート見てみようよ。。
KGN_digital

2018/07/16 04:14

ごめんなさい。学校で習っているだけで、どのCPU、ってことではないんです。 また、アセンブラでの減算は2の補数を使うと習いました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問