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

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

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

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

CASL

CASLは、情報処理技術者試験のプログラミング能力試験のために独自に開発されたアセンブリ言語です。架空の演算装置であるCOMETに対応可能。2001年からはCASLIIが後継として利用されています。

基本情報技術者

基本情報技術者とは、経済産業省が行う国家資格「情報処理技術者試験」の区分の一つです。試験ではプログラマーやシステムエンジニアなどIT業界で働くために必要とされる基礎知識や情報処理において論理的な考え方ができるか等が問われ、企業から高い評価を獲ることができ、IT業界の入門的な資格として人気があります。

Q&A

解決済

2回答

2577閲覧

CASLのCPL命令の考え方

cupnoodle

総合スコア20

アセンブリ言語

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

CASL

CASLは、情報処理技術者試験のプログラミング能力試験のために独自に開発されたアセンブリ言語です。架空の演算装置であるCOMETに対応可能。2001年からはCASLIIが後継として利用されています。

基本情報技術者

基本情報技術者とは、経済産業省が行う国家資格「情報処理技術者試験」の区分の一つです。試験ではプログラマーやシステムエンジニアなどIT業界で働くために必要とされる基礎知識や情報処理において論理的な考え方ができるか等が問われ、企業から高い評価を獲ることができ、IT業界の入門的な資格として人気があります。

0グッド

0クリップ

投稿2020/10/21 12:46

CASL2におけるCPL命令は「第1オペランド-第2オペランド」の結果によってフラグレジスタが設定される、と理解していますが、以下の例でサインフラグ=0となるのは何故でしょうか。


CASLシミュレータ(https://www.officedaytime.com/dcaslj/)で検証しております

CASL2

1MAIN START 2 3 LAD GR1,65534 4 LAD GR2,1 5 CPL GR1,GR2 6 7 END

結果:ZF=0 SF=0 OF=0


私の理解では
GR1-GR2=65533であり、2進数表現では1111 1111 1111 1101と言えるため、16桁目がサインフラグに入ってSF=1となるのでは、と思っているのですが…

上記の考え方だとCPA命令と結果が全く一緒になってしまう中で、CPL命令をどのように理解すべきか、実際はどういう演算を行っているのかを教えて頂けますでしょうか。

※もしかすると第15ビットの値がサインフラグに入る、と言う考えが誤りでしょうか。

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

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

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

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

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

guest

回答2

0

ベストアンサー

CASL2のSFの説明には確かに「演算結果の符号が負(ビット番号15が1)のとき1,それ以外のとき0になる。」と書かれていますが、これは「ビット番号15が1」を無視しないと意味が通りません。
仕様を見ると、CPA・CPLは比較の大小によってSFとZFがセットされることが分かります。
CPA・CPL
つまり、サインフラグという名ながら、CPLなどの「論理」(※)演算においては一般的なCPUのキャリーフラグと同様の使われ方をしているようです。

※CASL2におけるArithmetic/Logical(算術/論理)という語は一般的な意味とは異なり、符号付き/符号なしを表します。

CASL2は試験のためのCPUですので、このような一般的なCPUと敢えて変えたと思われる不自然な仕様が多々あります。アセンブラの学習には向きません。

投稿2020/10/21 13:41

ikadzuchi

総合スコア3047

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

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

cupnoodle

2020/10/22 12:00

ご回答ありがとうございます。 フラグレジスタにはどの演算にも共通するルールがあって、それに基づいて値がセットされるものと思っておりました。 CASL2のサインフラグは2タイプの使われ方(サインフラグタイプとキャリーフラグタイプ)があるんですね。 キャリーフラグと言う考え方を初めて知ったため、調べてみました。 他のアセンブリ言語においては、当初の私の考え方で辻褄が合うのかな?と思いながら調べましたが、現状はそこまで検証し得る理解には至れず…。 取り急ぎ、おとなしくCASL2の比較演算においては「左オペランドが大きな数字であればSF=0、右オペランドが大きな数字であればSF=1と言う仕様である」と考える事にしました。 学習に最適な言語だと思っていたので、これが不自然な仕様であり、しかも他に多々ある、というのは意外でした。
guest

0

もしかすると第15ビットの値がサインフラグに入る、と言う考えが誤りでしょうか。

間違いでしょう。
CPA GR1,GR2 ・・・ 2の補数表現-32768~32767とみなして大小比較してGR1が小さければSFが1
CPL GR1,GR2 ・・・ 符号無し2進数 0~65535とみなして大小比較してGR1が小さければSFが1

なので、CPAなら、-2 と 1 の比較で -2 が小さいので SF=1
CPLなら、65534 と 1 の比較で、65534 が大きいので SF=0

投稿2020/10/21 13:25

otn

総合スコア84555

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

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

otn

2020/10/21 14:21

他の方の回答にあるように、メジャーなCPUでのキャリー(ボロー)フラグと、サインフラグを1つのフラグでまかなおうとしているので、こういう仕様なのでしょうね。 (命令によって、キャリーの意味だったりサインの意味だったり) CASL1だとフラグ2つしか無いし。
cupnoodle

2020/10/22 11:56

ご回答ありがとうございます。 記載いただいた通り(=比較演算の仕様通り)に、解釈するしかないんですね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問