• 締切済み

マイクロプロセッサ毎のニーモニックの違い

アセンブリ言語レベルでの話です。 データ転送命令は、どのプロセッサでも必須の命令ですが、これにはld系とmov系があります。 この二つの違いを教えてください。 とりあえず、私が考えたのは、 1. メーカーによる違いでもなさそう。  インテルは8ビットCPUでld命令、16ビット以降でmov命令ですね。  最悪なのはATMELのAVR。同じプロセッサでldとmovがある。 2. データ転送の向きによる区別でもなさそう。  インテルは「mov dst,src」だし、日立は「mov src,dst」 の2つですが、両方とも反例がありました。

みんなの回答

  • SPROCKETER
  • ベストアンサー率26% (2045/7633)
回答No.5

 データ転送命令は各社バラバラで特に決まっているルールはないと考えて良いでしょう。統一した命令系を作らないようにすることによって、CPU命令の互換性を無くすようにした結果と考えて良いです。  たとえば、Z80の命令系ではデータ転送はLDでしょうが、MC6809の命令系ではデータ転送はLDとSTがあります。他に、EXG、PUSH、POPなどもデータ転送を伴う命令です。  同様に、86系の命令系ではデータ転送はLD、ST、MOV、XCHG、PUSH、POPなどとなります。  レジスタ間でのデータ転送に限れば、MOV、XCHGだけでしょうが、データ転送命令を1つだけに限るのは混同や誤解を招くので、分類されて命名されている例が多いようです。

全文を見る
すると、全ての回答が全文表示されます。
  • saru_1234
  • ベストアンサー率33% (452/1341)
回答No.4

#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 が素直な気がします.

Ekukos_bloomers
質問者

お礼

色々なお話をありがとうございます。 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 が素直な気がします. これは、今まで気が付かなかった考え方です。

全文を見る
すると、全ての回答が全文表示されます。
  • moxom
  • ベストアンサー率0% (0/0)
回答No.3

8080 z80で言えば視点の違い、かもしれません。 CPUを外から操作するイメージでMOV、自分がCPUになった イメージでLD。 CP/M付属のアセンブラは8080用なのでインテル表記でしたが、自分が何をしているか明確でバグが出にくかった気がしますね。 LD表記だとだんだん混乱してくる気がします。

Ekukos_bloomers
質問者

お礼

回答ありがとうございます。 > CPUを外から操作するイメージでMOV、自分がCPUになったイメージでLD。 ここら辺がちょっとわからないので、もう少し詳しく教えてください。 また、 > LD表記だとだんだん混乱してくる気がします。 どのような経験があるか教えていただければ幸いです。

全文を見る
すると、全ての回答が全文表示されます。
  • Qwerty-36
  • ベストアンサー率25% (58/226)
回答No.2

こんなの、メーカーの好き勝手。 ついでに言うと、それよりちょっと前に作られた大型機、他社マイコンとかのニモニックを参考に、「ワタシは、MOVの方が好きだ」、「ロードで良いや」と決めているようです。 intelで8080のニモニックを作る際に、movだったけど、zilogでZ80を作るときに「movって移動だよね。元のデータがレジスタ内にあるんだから、ロードだろ」とか言ったのかもしれませんね。 データ転送の向きもA→Bか、B←Aか、それも、ニモニック作者の好み。 で、私が昔使っていたのは、下記の様に数式で書けるアセンブラ。Baseっていう、キャリーラボのアセンブラをキャリーDOS上で使っていました。 CLR(A) (X+)=A XOR(A) (HL+)=A だって、もう、いちいち転送の方向とか、movなのか、LDなのかなんて覚えていられないじゃない?。 あと、これとは話は違いますが、昔、8ビット某ゲームメーカーに遊びに行ったとき、シフトの方向と、それにキャリーが含まれるのか、含まれないのかを一覧表にしたものが壁に貼ってありました。

Ekukos_bloomers
質問者

お礼

> こんなの、メーカーの好き勝手。 やっぱり、そうなのですね。 > intelで8080のニモニックを作る際に、movだったけど、zilogでZ80を作るときに「movって移動だよね。元のデータがレジスタ内にあるんだから、ロードだろ」とか言ったのかもしれませんね。 そんな様子が想像できます。 > で、私が昔使っていたのは、下記の様に数式で書けるアセンブラ。Baseっていう、キャリーラボのアセンブラをキャリーDOS上で使っていました。 この様な、マクロっぽいアセンブリ言語(?)だと便利ですね。

全文を見る
すると、全ての回答が全文表示されます。
  • saru_1234
  • ベストアンサー率33% (452/1341)
回答No.1

メーカが違えば、というか仕様決定者が違えば 考え方も違うわけで、そんなに深い意味はないと思いますが。 なので、ご質問のポイント > これにはld系とmov系があります。 > この二つの違いを教えてください。 は、複数メーカに亘る的確な回答はないと思います。 あえて言えば、(私は知りませんでしたが)1プロセッサで 両命令があるというAVR。 これこそ別の名称を使っているのですから違いがあるのでは? 私もここ10年くらいのCPUは知りませんが、 25年以上前の インテルの8ビットCPU 8080 や8085 は MOV でした. インテルのは転送だけではフラグは変化しませんが、 モトローラのは転送だけで動くフラグがありました。 各社各様のニーモニックで、技術者の負担が多く 公的な技量を測りにくかったので、 情報処理技術者の資格試験用に仮想CPUが規定され これのニーモニックを使い出題されたこともありました。

Ekukos_bloomers
質問者

お礼

> メーカが違えば、というか仕様決定者が違えば > 考え方も違うわけで、そんなに深い意味はないと思いますが。 結局、こうなるんですね。 > 25年以上前の インテルの8ビットCPU 8080 や8085 は MOV でした. 私は、Z80がld命令だからか8080Aはld命令だと勘違いしてました。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • PDP-11のアセンブラ課題

    学校の課題で出されたものです。 まだ勉強をはじめたばかりでどこから手をつけていいのかわかりません>< ○PDP-11のアセンブラは、MOV#1,R2を次のような2語の機械語に翻訳する。PDP-11は、これをど  のように解釈し、どのように実行するのか説明せよ 0001010111000010 0000000000000001 ○PDP-11のMOV命令を使用し、以下の命令のアセンブリ言語表現、機械語表現を示せ。 ・R5が示すアドレスにジャンプする命令 ・サブルーチンから戻る命令 ・R0をスタック上にプッシュする命令 ○次のプログラムをPDP-11のアセンブリ言語で作成せよ。 ・R0が示す番号以降のR2が示すバイト数をR1が示す番号以降に転送 ・R1(上位16ビット)R0(下位16ビット)が示す符号付32ビット値を符号反転 宜しくお願い致します。

  • 命令セットについて

    インテルのアセンブリ言語の命令セットとMIPSの命令セットの構成の違いを詳しく教えて下さい(*_*) お願いします★

  • アセンブラの命令について

    データ転送命令MOV ds と制御命令MOV addを実行するに必要なメモリアクセス回数は最大何回になりますか。 よろしくお願いいたします。

  • CPUの扱えるデータ量の計算の仕方

    CPUについて調べていたのですが、 この記事の http://oshiete1.goo.ne.jp/qa387968.html 「このMHzが何を意味するかというと、一度に何回データを転送したかを指します。32bitのプロセッサでは4バイト(32ビット)の命令を一回に処理装置に転送します(これはあくまで内部バスも32ビットである場合です)。たとえば、100MHzのプロセッサでは、4バイト×32ビットとなり、1秒間に400MBのデータを扱うことができるのです。」 という箇所(良回答20ptをもらっている回答)の最後の部分 なのですが、100MHzのプロセッサでは、400MBのデータ を扱うことができるとあるのですが、どうやって400MBという 値になるのかよく分かりません。 ひとつひとつの数値の意味を説明していただかないと、よく分からない のですが、このあたりのご説明をお願いします。

  • アセンブリ命令、命令セットアーキテクチャ等の用語

    ソフトウェア中心の技術者です。 コンパイラからアセンブリ言語を吐き出させ、そこからプロセッサ内部の動作を詳しく解析していたいと思っています。そうしたところ、先輩から「そういうことなら、命令セットアーキテクチャを勉強するといいよ」、とアドバイスをもらいました。 ここで質問なのですが、 1 「アセンブリ命令」と「命令セット」とはほぼ同じ言葉だと思って差し支えないでしょうか? 2 また、「命令セットアーキテクチャ」とは、「決定した命令セットから成るプロセッサ内部の仕様」と思って良いのでしょうか? 例えば、ジャンプ命令を受けたときには、構造的にどのようなしくみでプログラムカウンタのデータを変えるか、とかを規定したしくみそのものと理解していますが、それで正しいでしょうか?  以上、よろしくお願いします。

  • 複数バイト命令実行のタイミング

    1バイト単位でメモリの各アドレスにデータが保存されているコンピューターにおいて、複数のバイトで表される命令がどのように実行されるのか教えて下さい。 メモリには一つのアドレスごとに8ビット(1バイト)のデータが入っており、CPUはプログラムカウンタで示されたメモリ上のアドレスにあるデータや命令を一つずつ順番に読み込んで、それをデコーダーが解釈し各回路への指令に変換することでプログラムを実行していくということは理解しています。 しかし現在の32ビットコンピューターなどにおいてアセンブリの命令、例えば「MOV A,B」(Bレジスタの内容をAレジスタにコピーする)といった命令は、「B90001」などの3バイトのマシン語で表されるとすると、メモリ上では アドレス  内容 0000  0xB9 0001  0x00 0002  0x01 のように3つの連続するアドレスにまたがってデータが存在し、CPUが「MOV A,B」を読み込み、それを順次デコーダーに送るまでには「MOV」、「A」、「B」の3クロックを要すると思います。 その際、デコーダーが命令を解釈し各回路に指令の信号を送るタイミングというのは、最後の「B」のデータを読み込んだ時点になるのでしょうか?もしそうならば、3クロック目に最後の「B」のデータがデコーダーに到着するまでの間、「MOV」と「A」のデータというのはCPUにメモリから読み込まれた後はどのように扱われるのでしょうか? 少し質問が分かりにくく恐縮ですが、情報工学を独学で勉強しており、プログラムが実際の回路でどのように実行されるのか理解したいと思っています。 どうぞご回答よろしくお願い致します。

  • R8C/27のデータフラッシュに保存する

    タイトルのとおり、R8C/27のデータフラッシュにデータを保存する方法に関して 言語はアセンブリです。セクションを設定して、MOV命令で読み書きできるのでしょうか。 ご教授お願い致します。また参考になるサイト等あれば教えてください。

  • 機械語とアセンブリ言語について。

    (機械語データ) (アセンブリ言語) b8 57 61 6b 61 mov $0x616b6157,%eax 53 push %ebx 50 push %eax ba 04 00 00 00 mov $0x4,%edx bb 01 00 00 00 mov $0x1,%ebx b8 04 00 00 00 mov $0x4,%eax 89 e1 mov %esp,%ecx cd 80 int $0x80 58 pop %eax 31 c0 xor %eax,%eax 5b pop %ebx c3 ret こちらのアセンブリ言語の命令がわかるおすすめの書籍を知らないでしょうか? 教えていただけないでしょうか?すみません。

  • 文字を表示するファンクションコールについて

    アセンブリ言語プログラムについての質問です。 MASM32を使っています。AXレジスタの数値をah→表示、al→表示というプログラムを作ったのですが、al→表示の部分がうまく機能しせません。以下にプログラムを書きます。 (1)mov ax,3132h (2)mov dl,ah (3)mov ah,02h (4)int 21h (5)mov dl,al (6)mov ah,02h (7)int 21h (分かりやすく番号をふっています。実際のプログラムには番号はふっていないです。) 具体的どこが機能しないかというと、(5)番目の命令のalレジスタの内容をdlレジスタに転送するという命令が機能しません。デバックのT命令で確認したところ(5)番目の命令がNOPとなっていました。 このプログラムを実行すると結果的に表示されるのは「11」という文字です。(本来は12と表示したい。) 質問 なぜ(5)番目の命令がnopとなるのでしょうか?

  • プロセッサ(32bitと64bit)の違い

    最近、サーバ系のプロセッサでIntel XeonやItanium2等 出ています。両者の大きな違いはアーキテクチャというのが32bitか64bitと言うことのようですが、アーキテクチャが違うと何が違うのでしょうか? 単純に周波数やキャッシュ容量で性能比較はできないのでしょうか?