- 締切済み
マイクロプロセッサ毎のニーモニックの違い
アセンブリ言語レベルでの話です。 データ転送命令は、どのプロセッサでも必須の命令ですが、これにはld系とmov系があります。 この二つの違いを教えてください。 とりあえず、私が考えたのは、 1. メーカーによる違いでもなさそう。 インテルは8ビットCPUでld命令、16ビット以降でmov命令ですね。 最悪なのはATMELのAVR。同じプロセッサでldとmovがある。 2. データ転送の向きによる区別でもなさそう。 インテルは「mov dst,src」だし、日立は「mov src,dst」 の2つですが、両方とも反例がありました。
- みんなの回答 (5)
- 専門家の回答
みんなの回答
- SPROCKETER
- ベストアンサー率26% (2125/7985)
データ転送命令は各社バラバラで特に決まっているルールはないと考えて良いでしょう。統一した命令系を作らないようにすることによって、CPU命令の互換性を無くすようにした結果と考えて良いです。 たとえば、Z80の命令系ではデータ転送はLDでしょうが、MC6809の命令系ではデータ転送はLDとSTがあります。他に、EXG、PUSH、POPなどもデータ転送を伴う命令です。 同様に、86系の命令系ではデータ転送はLD、ST、MOV、XCHG、PUSH、POPなどとなります。 レジスタ間でのデータ転送に限れば、MOV、XCHGだけでしょうが、データ転送命令を1つだけに限るのは混同や誤解を招くので、分類されて命名されている例が多いようです。
- saru_1234
- ベストアンサー率33% (452/1341)
#1 です. 8080 でも「ロード」の語を使った命令はあります. うろ覚えですが LHLD という, HLレジスタ(16bit)に,メモリからの16bit値をロードする 即ち Load HL Direct ... そんな意味だったと思います. 逆方向は Store で, SHLD というニーモニックでした. そうそう,8bit では Aレジスタを使う LDA, STA というのもありました. 8080 の頃は,ベンダ側が作るアセンブラやコンパイラへの配慮もあるように思います. CPUを売る為にはなるべく同時期にリリースしたいので 短期間で作れて,構造がなるべくシンプルでバグが出にくい、 そんな体系なのではないかと思います. 8080 の MOV, MVI, LHLD, SHLD, PCHL などは, Z80では全て LD です. (ニーモニックを書く際に Z80 では何でも LD で済むので 楽といえばそうですがうっかり存在しない命令も書けてしまうのが難点) 生成する命令コードがニーモニックだけでは決定できず 続くオペランド等も参照し、なおかつ IX,IYレジスタが出てくるとまた違ってくる... という複雑な構造になります. Z80 の命令コード体系は, 8080 のそれの空きコードを使って拡張した格好だし, (それゆえ 8080 マシンコードのプログラムがそのまま走れる) Z80 開発時は 8080の開発に関わった人間がスピンアウトして参加していた(中心人物?) という話もあり,あえて同様のニーモニックにはしたくなかったのかも知れません. 勉強し始め知り合いから、「MOVってmove だから 転送元データは消えるのかと思ってた」と聞かされました. 無理もないですね.いっそ COPY なんてニーモニックが いいかも? MOV dst,src の記述位置関係については, 数値を含んだ命令コードだとその数値はコードの後ろの方に置かれるのが普通でしょうから、 MOV dst,src が素直な気がします.
- moxom
- ベストアンサー率0% (0/0)
8080 z80で言えば視点の違い、かもしれません。 CPUを外から操作するイメージでMOV、自分がCPUになった イメージでLD。 CP/M付属のアセンブラは8080用なのでインテル表記でしたが、自分が何をしているか明確でバグが出にくかった気がしますね。 LD表記だとだんだん混乱してくる気がします。
お礼
回答ありがとうございます。 > CPUを外から操作するイメージでMOV、自分がCPUになったイメージでLD。 ここら辺がちょっとわからないので、もう少し詳しく教えてください。 また、 > LD表記だとだんだん混乱してくる気がします。 どのような経験があるか教えていただければ幸いです。
- Qwerty-36
- ベストアンサー率25% (58/226)
こんなの、メーカーの好き勝手。 ついでに言うと、それよりちょっと前に作られた大型機、他社マイコンとかのニモニックを参考に、「ワタシは、MOVの方が好きだ」、「ロードで良いや」と決めているようです。 intelで8080のニモニックを作る際に、movだったけど、zilogでZ80を作るときに「movって移動だよね。元のデータがレジスタ内にあるんだから、ロードだろ」とか言ったのかもしれませんね。 データ転送の向きもA→Bか、B←Aか、それも、ニモニック作者の好み。 で、私が昔使っていたのは、下記の様に数式で書けるアセンブラ。Baseっていう、キャリーラボのアセンブラをキャリーDOS上で使っていました。 CLR(A) (X+)=A XOR(A) (HL+)=A だって、もう、いちいち転送の方向とか、movなのか、LDなのかなんて覚えていられないじゃない?。 あと、これとは話は違いますが、昔、8ビット某ゲームメーカーに遊びに行ったとき、シフトの方向と、それにキャリーが含まれるのか、含まれないのかを一覧表にしたものが壁に貼ってありました。
お礼
> こんなの、メーカーの好き勝手。 やっぱり、そうなのですね。 > intelで8080のニモニックを作る際に、movだったけど、zilogでZ80を作るときに「movって移動だよね。元のデータがレジスタ内にあるんだから、ロードだろ」とか言ったのかもしれませんね。 そんな様子が想像できます。 > で、私が昔使っていたのは、下記の様に数式で書けるアセンブラ。Baseっていう、キャリーラボのアセンブラをキャリーDOS上で使っていました。 この様な、マクロっぽいアセンブリ言語(?)だと便利ですね。
- saru_1234
- ベストアンサー率33% (452/1341)
メーカが違えば、というか仕様決定者が違えば 考え方も違うわけで、そんなに深い意味はないと思いますが。 なので、ご質問のポイント > これにはld系とmov系があります。 > この二つの違いを教えてください。 は、複数メーカに亘る的確な回答はないと思います。 あえて言えば、(私は知りませんでしたが)1プロセッサで 両命令があるというAVR。 これこそ別の名称を使っているのですから違いがあるのでは? 私もここ10年くらいのCPUは知りませんが、 25年以上前の インテルの8ビットCPU 8080 や8085 は MOV でした. インテルのは転送だけではフラグは変化しませんが、 モトローラのは転送だけで動くフラグがありました。 各社各様のニーモニックで、技術者の負担が多く 公的な技量を測りにくかったので、 情報処理技術者の資格試験用に仮想CPUが規定され これのニーモニックを使い出題されたこともありました。
お礼
> メーカが違えば、というか仕様決定者が違えば > 考え方も違うわけで、そんなに深い意味はないと思いますが。 結局、こうなるんですね。 > 25年以上前の インテルの8ビットCPU 8080 や8085 は MOV でした. 私は、Z80がld命令だからか8080Aはld命令だと勘違いしてました。
お礼
色々なお話をありがとうございます。 8080側が、アセンブラを作る方を向いていたと言うことですね。 Z80では、8080の転送命令をまとめてldにしたのでニーモニックがシンプルになったけど、ありえないレジスタとの組み合わせが面倒になった。 なる程です。 私は、Z80形式の方が好きだなぁ。 そういえば、Z80では加算命令は、 add A,B ; Reg.A = Reg.A + Reg.B の場合。 と記述するのに、減算命令は、 sub B ; Reg.A = Reg.A - Reg.B の場合。 と、加算のときにAレジスタしか使えないのに「A,」を省略できないんですよね。 16ビット加算命令があるから? でも16ビット減算命令もあるよね。 これは、凄く使いにくい! > MOV dst,src の記述位置関係については, > 数値を含んだ命令コードだとその数値はコードの後ろの方に置かれるのが普通でしょうから、 > MOV dst,src が素直な気がします. これは、今まで気が付かなかった考え方です。