2016-07-23 25 views
-1

PDPエンディアンでビットシフトを実行すると、この動作は少しエンディアンまたはビッグエンディアンのシステムよりも少し時間がかかりますか?PDPエンディアンおよびビットシフト

私がこの質問をする理由は、シフトのすべての方向に進むビットのように思えるからです。コンピュータが行うのは難しいでしょう。

私はPDPエンディアンマシンにアクセスできないため、これをテストする方法はありません。 =(

+3

あなたが話をしている場合は一箇所でメモリに格納された整数はまだ3つの命令で行われ左シフトPDP11は、16ビットマシンで、16ビットレジスタを備えています。 AFAIR、PDP11エン​​ディアンは32ビットの 'long'がメモリにレイアウトされる方法を指します。これは通常レジスタで行われるシフトにはあまり関係ありません。 PDP11上の32ビットシフトは、おそらく32ビットマシン上では64ビットシフト、64ビットマシン上では128ビットシフトのように見えます。 – EOF

+0

@dwelch私は何もしていません....これは単に好奇心の外です。 – DarthRubik

+0

任意のビット単位の操作が表現ではなく値で動作する –

答えて

0

・ミドルエンディアンまたはPDPエンディアンのシステムでは、新しいソフトウェアの 開発者は、それだけで完全に合理的ではありません。最初の最下位バイトを持つ各単語と 最初の最も重要な単語を、保存しますが、 この可能性を無視することを強くお勧めします。 中間のエンディアンが のようなもので現われたにもかかわらず、 中間エンドフォーマットのメモリに32ビット整数値を格納したプロセッサがこれまでにあったとは思わないフォーマット、浮動小数点 フォーマット、およびあいまいな通信プロトコル(これはVのTCP/IPパケットの長さが の場合に使用されますisaの「Visa Base I」プロトコル)。

私は自分自身に答えると思います。

あなたがシフトと言うとき、ビットシフトを意味しますか?

このように考えると、プロセッサがそれをサポートしていれば、そのようなさまざまな機能を実行するよう指示されている可能性があります。一部のプロセッサは、常にキャリービットに1ビットシフトしたり、周りを回転したりします。だから、それは無関係で、同じスピードでも何の関係もありません。

他のものと同様に。あなたがそれを見て、それをバイトとして操作しているのであれば、それを遅くて苦痛にさせるために、それをゆっくりと痛ましいものにしています。しかし、バイトはエンディアンレスなので問題ありません。

あなたは言葉に(うまくいけば)対処しており、エンディアンの1つがなくなります。しかし、他のすべての単語が異なるエンディアンであっても、どちらの種類の読み込み機能(複数のプロセッサで可能)を持っていても、あなたはまだ言葉でビットをシフトしている気にはならないが、エンディアンはその点でも消え去る。

神話の下にある同じWebページ。

PDP-11は「中間エンディアン」でした。ただの並べ替え。 PDP-11はメモリに32ビット値を格納するための指示を持たないため、 "中間値"の値はメモリ内に 値を格納した方法には適用できませんでした。それは通常の リトルエンディアン方式でメモリに16ビット値を格納しました。 の値を(メモリではなく)16ビットCPUレジスタのペアに格納して32ビットの算術演算を行うことができます。ほとんどの という重要な単語が低い番号のレジスタに入りましたが、各 のレジスタ値はリトルエンディアンで保存されていました。だから "ミドルエンディアン"と見なすことができましたが、その意味ではアセンブリ言語である 言語プログラマとコンパイラライターにとっては意味があります。そのコードは決して移植可能でないと は決して望みませんでした。

0

エンディアンは、単語を保存して別々に見た場合にのみ観測されます。

任意の種類のマシン上のレジスタのデータは、左にMSBを持つバイナリとして常に動作します(0b10110101のようなプレース・バリュー表現で書いたように)。左シフトは常に2の累乗で乗算され、右シフトは、マシンが大きくても、小さくても、pdp-エンディアンであろうと、常に2のべき乗で除算されます。

エンディアンは、1バイトを超えるロードまたはストアを実行するときに、CPUのロード・ストア・ユニットに適用されると考えてください。コアのレジスタと実行ユニットの部分は、レジスタ幅の2進整数を見るだけです。


それはマシンのネイティブエンディアンに依存せずにバイトストリームへ/から整数をシリアライズする"endian agnostic" codeを書き込むことが可能です。例えばintに余分な4バイトに:

i = (data[0]<<0) | (data[1]<<8) | (data[2]<<16) | (data[3]<<24); 
1

PDP11の中央エンディアン形式は、16ビットマシン上で32ビット演算をエミュレートする必要が出てきます。これは、PDP11がそのデータにリトルエンディアンを使用していても、最初に高ワードを格納し、次に低ワードをメモリに格納することによって行われます。これは不思議なエンディアンを引き起こします。実際には、実際にはパフォーマンスの違いはありません。リトルエンディアンで格納され

mov #var+2,r0 ; load the address of the low word 
asl (r0)  ; left shift low word 
rol -(r0)  ; left shift high word with carry 

var場合、コードはようになります:

move #var,r0 ; load address of the low word 
asl (r0)+  ; left shift low word 
rol (r0)  ; left shift high word 
+0

* * OPはPDP-エンディアンの32ビットワードを1回の操作でシフトすることを想像していましたが、これを行うためのハードウェアは、右から左に行く(これが私の答えをその部分に集中させた理由です)。 PDP-11は16ビットマシンであり、実際のコードシーケンスであることを指摘している。 –