忍者ブログ
[PR]
×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。


2025/02/26 10:48 |
それはシングルなのかダブルなのか
一概に言えないのが難しいとおもうの くまですこんにちは

富士のシーケンサはシングルとダブルでデバイスの名称が違うのです
WMとDM、WLとDLといった具合にシングル用のワードデバイスと
ダブル用のワードデバイスで名称が違う(使ってる内部メモリは一緒の場所なんだけど)

んでもってご丁寧にDMやDLに奇数アドレス(たとえばDM1とか)を指定すると
「アドレスがおかしいよ」と通達してくれる機能付き

と、言ってもDL0を初期化した後に、WL1に定数1を転送して
DL0を覗くと言うまでも無く値がぶっ飛んでますし
この仕様のお陰で融通が効かないという点もあるので一概に良いとはいえません

で、三菱 こちらはシングルとダブルでデバイスが区別されていません
ダブルワードで使うならアドレス2つ分をユーザーが確保する必要があります

その代わり、自由度は高く16ビット転送命令であるMOVや16ビット演算命令にも
ダブルワードに割り当てたアドレスを指定できたりします 指定できてしまいます

だから例えば
      D1                     D0
0000000000000001 0000000000001000(65544D)という値のダブルワードに対し
「1を代入したいです」とか言って[MOV K1 D0]とかやってしまうと
0000000000000001 0000000000000001(65537D)という値になり
思い通りに動きません
MOVはシングルワード用転送命令なので
D0に当たるビットの部分しか書き換えないからですね
そして、これに気付けず1時間くらい首をひねる羽目になるわけです

後、「値自体は16ビットで収まるけど、命令で扱う都合上
ダブルワードとして定義しないといけないシングルワード」と言う
落とし穴もあり混乱に拍車を掛けます

たとえば
[MOV K1000 D100]
[MOV K1000 D101]
[DMOV K100000 D102]
[D* D100 D102 D104]
[D/ D104 D101 D106]
と、実行すると値はどうなるでしょう
普通に考えれば「D102に100000を代入」して「1000をかけて」、「1000で割る」ので
当然D106には100000が入るはずです

が、実際実行してみるとD106の値は1になるはずです
なぜ!と思って、これが実行される様子を順を追って見て行くと

まずMOV K1000の時点でD100とD101は以下のようになります
0000001111101000(1,000D)

また、DMOV K100000の時点ではD102の値は以下のようになります
00000000000000011000011010100000(100,000D)

ここまではいいんですが、次の行[D*~]で計算が狂います
理由はD*という命令はダブルワード用の乗算命令であり
「命令内で指定されたデバイスは全てダブルワード(32ビット)としてみなす」為です
その為、D100もダブルワードとしてみなされ
「D100に入っている値が下位16ビット、D101に入っている値が上位16ビット」の
32ビットとして、値が見られてしまうのです

なので、D100の値は
00000011111010000000001111101000(65,537,000D)として扱われ

そこに10万をかけるわけですから結果としてD104は
1011111010111100110111101011110000100000000(6,553,700,000,000D)
という値になってしまいます

で、次 なぜこれを1000で割って1になるのか
理由は先ほどと同じく、D/は32ビットの除算命令なので
「命令内のアドレスは全て32ビットとしてみなす」為です
そして、今回の場合はD101だけでなくD104の値も正常に扱われません
D101とは逆に、ビット長が長すぎるためです(D*の演算結果は64ビット長となる)

よって、D104は33ビット目以降が切り捨てられ
11100110111101011110000100000000(3,874,873,600D)となり

D101はD102の下位16ビットを上位16ビットとしてみなされた32ビット長となるため
10000110101000000000001111101000(2,258,633,704D)となります

そして、この2つを割って小数点を切り捨てると1になります

こんな感じで、値自体は小さいんだけど演算などでダブルワードに絡める場合は
予めダブルワードとしてアドレスを1つ飛ばしにしておくか
別なデバイスにDMOVしておく必要があるって事です

流石に上記の様な露骨な間違いはしませんが、紐解いていくと
「シングルワードにダブルワード値入れてたー」とか
「何か一箇所D*じゃなくて*になってたー」とかやってたりするのが怖い所
つまりぼくには才能がなかった
PR

2012/09/29 00:47 | Comments(0) | その他

コメント

コメントを投稿する






Vodafone絵文字 i-mode絵文字 Ezweb絵文字 (絵文字)



<<そして | HOME | 今日は>>
忍者ブログ[PR]