アセンブラwordという単位について

このQ&Aのポイント
  • アセンブラでよく使われる単位「word」について疑問があります。具体的には、他の場面でも聞いたことがあるような気がしますが、詳細は忘れてしまいました。また、アセンブラでは一般的に2バイト1ワードと言われていますが、その根拠についてもわかりません。
  • また、現在では64ビットCPUが存在するため、4バイトの場合は「dword」と表現されることが一般的ですが、それ以上の大きさの単位についてもありますか?
  • 具体的には、以下の2つの質問です。1つ目は、dwordより大きな単位が存在するかどうかです。そして、2つ目は、2バイト1ワードの根拠は何かということです。ご教示いただけると幸いです。
回答を見る
  • ベストアンサー

アセンブラwordという単位

アセンブラでwordという単位がよく使われるそうですが、wordという単位は他でも聞いたことがあるようなきがしますがよく覚えていません。そこでは1バイト1ワードだったような気もします…。 アセンブラでは一般的に、2バイト1ワードらしいのですが、その根拠がよく分かりませんでした。 もしかしたらマシン語が1命令2バイトで表せるからかなーなどと推測したのですが、どうでしょう。 あと、4バイトの場合dwordと表現するようですが、64ビットCPUが出てきた現在、それ以上の表現もあるのかなーなどと思っています。 質問は以下です。 ・dwordより大きい単位はあるか(あればその内容) ・2バイト1ワードの根拠は何か よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • a-saitoh
  • ベストアンサー率30% (524/1722)
回答No.1

wordというのはCPUのレジスタ長です。そのためアセンブラによってwordが何バイトになるかは異なります。 Pentiumなど、16ビットCPUから進化してきたCPUのアセンブラでは、16ビット時代の用語をそのまま使っているため、レジスタ長とword長が合致しなかったりしますが。 16ビット系CPU(とその発展系CPU)の場合 word 16bit longword あるいは doubleword(dword) 32bit quadword 64bit 32 ビット系CPUの場合 half word 16bit word 32bit double word 64bit たとえば、こんな感じかな。

arakororin
質問者

お礼

すばらしい! 参考になりました。 ありがとうございました。

関連する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ビット値を符号反転 宜しくお願い致します。

  • アセンブラのCAP-X COMP-X

    アセンブラのCAP-X COMP-X  いつも回答いただきありがとうございます。 アセンブラのCAP-X COMP-Xと言っても、知っている人は、少ないのでは無いでしょうか?  アセンブラのプログラムを組む機会自体が、減少していると思えるのです。  私が、最初に情報処理試験で触れたのは、このアセンブラと仮想のコンピュータでした。いつか、征服したいテーマでした。  でも、今でも、アセンブラと仮想機械では、もっとも、シンプルで、アセンブラの言語と原理を知るには、もっともふさわしいのでは、無いかと考えているのです。  その後も、アセンブラと仮想の機械は、進展しましたが、知らない者には、いよいよ理解しがたく、近づくことが、できないので、この CAP-X COMP-Xを  まず、理解したいと考えているのです。、  アセンブラを理解できる人には、なじみの無いアセンブラと仮想機械と思いますが、現在知っているアセンブラから、類推して回答していただけるとありがたいです。  今は、Windowsの時代になってCAP-X COMP-Xをシュミレーションできるソフトも無くなりました。頭の中で仮想するばかりです。  一語16ビットの計算機であって、0を含めて256の整数倍の番地から始まる連続した256語を1記録ブロックとして、最少1記憶ブロックから最大256記憶ブロックを実装することができる。N個の記憶ブロックを使用するとき、アクセスできるアドレスは、 0番地から(256*N-1)番地までである。  Nが、256の時、 256*256-1=65536 となって65Kのアドレス空間を持つことになる。 ●Q01. このメモリーの中で、コードとテータの両者を使っていると解釈してもよいのだろうか? ●Q02. もし、メモリーのアドレス空間をコードとデータの両者を混合して使用していると誤ってプログラムしてしまうとコードをデータとして読み込んだり、コードのアドレスに誤って、データを書いてしまい、これが、原因で、コンピューターが、暴走したりする危険性は、あるのでしょうか? ●Q03. この仮想の機械には、OSのような領域は、存在しないのでしょうか? ●Q04. 必要ないのでしょうか?  OSが、必要であるのなら、65Kの全ての領域は、使用できなくなると考えることができるのでしょうか? ●Q05. アセンブラの記号を作って、実行するようにしています。しかし、アセンブラを機械語にアセンブルして、メモリーにロードする必要があるように感じますが、この機械では、 アセンブラを機械語に翻訳するソフトは、どのようにして利用されるのでしょうか? ●Q06. 最初にアセンブラ言語を機械語に変換するアセンブリ言語をメモリーにロードしてから、アセンブラを機械語に変換して、メモリーにロードして、アセンブリ言語をクリアして使用するということになるのでしょうか? ●Q07. これなら、機械語とデータ領域の合計として65Kを使えるということになるのでしょうか?  16ビットの命令語のうちアドレスを指定できるのは、 ADフィールドの アドレスの下位8ビットを指定することになります。  これでは、256通りしか表現できません。  上位8ビットは、 BR(基底レジスターbase register)で定められる。  つまり、BRを変更しないと256通りのアドレスを超えてのアドレスを指定できなくなる。  このBRを変更するのに、 JSR命令(jump to subroutine)が使用される。subroutineに飛ぶのと、記憶ブロックを超えるのとどうして、同じ命令で行われるのか分かりません。 ●Q08. どうしてでしょうか?  昔、ユニバック、マシーンというのがありました。  36ビット、1ワードの機械でした。36ビットの中に命令部分とアドレス部分16ビットの両方を納めなければならないので、アドレス空間には、限度がありました。  16ビットだと限度のアドレス空間は、65Kワードということになります。  これ以上に大きな空間は、アクセスできない。  バイトマシーンのように最初の命令語によって、何バイトでも、アキュームレーターに収納できて大きなアドレス空間にアクセスできるようになっていなかったのです。  大きな容量のプログラムを作るとき、65Kワードでは、収納できない。それで、使用したのは、オーバーレイという手法でした。  プログラムをセグメントに切って、必要に応じて順にプログラムをメモリーに載せ替えるという方法です。しかし、セグメントが大きくなるとこれでは、収まることができないので限度がありました。 ●Q09. オーバレイのやり方は、記憶ブロックのやり方と同様と考えて良いのでしょうか?  初期的な質問で申訳ありません。  また、質問が続くようなことがありましてもよろしく教授方お願いします。 ーーーーーーーーーー CAP-X Computer Application X https://ja.wikipedia.org/wiki/CAP-X CAP-X とは、かつて情報処理技術者試験でのプログラミング能力試験のために使用されていたアセンブリ言語である。後継のCASLに置き換えられ、現在はCASL IIが使われている。 COMP-X の仕様[編集] COMP-X はデータワード長が16ビット、メモリアドレス長も16ビットのコンピュータである。アドレスはバイト単位ではなくワード単位に付与される。ワード中のビットの番号付けは、最上位ビットを 0 番、最下位ビットを 15 番とする。バイト単位の処理という概念がないため、エンディアンも規定されていない。また、COMP-X には入出力の概念が規定されておらず、何らかの手段でメモリ上にプログラムとデータを格納し、実行し、その結果はメモリを読み取ることでわかるようになっている。従って、入出力命令は存在しない。扱う数は整数のみで、2の補数表現を採用している。 レジスタは次の通り。 ーーーーーーーー COMP-X Compuer X https://ja.wikipedia.org/wiki/CAP-X CAP-X とは、かつて情報処理技術者試験でのプログラミング能力試験のために使用されていたアセンブリ言語である。後継のCASLに置き換えられ、現在はCASL IIが使われている。 命令語は全て 1 ワードであり、先頭から順に OP フィールド(4ビット)、GR フィールド(2ビット)、XR フィールド(2ビット)、AD フィールド(8ビット)で構成される。OP フィールドは命令の種類を表すコード(オペコード)であり、COMP-X には 12 種類の命令しかない。GR フィールドでは演算で使用する GR の番号が指定される。また、JC命令では分岐条件の指定に使われる。XR フィールドではアドレス修飾を行う GR の番号が指定され、内容が 0 の場合は GR0 を意味するのではなく、GR によるアドレス修飾をしない。AD フィールドはアドレスの下位8ビットを指定する。 実効アドレスとは命令で使用するメモリアドレスであり、上位8ビットは BR で、下位8ビットは AD フィールドで指定される。XR フィールドが 0 以外の場合、指定された GR の下位8ビットと AD フィールドの値を加算し、結果の下位8ビットを実効アドレスの下位8ビットとする。

  • 64bitアセンブラ

    NASKなどのコンパイラで64bitのマシン語を扱うことは可能でしょうか? 64bitの命令も知らないので書籍も探しています。 もし64ビット命令?を使ったHellow Worldが書ける方、サンプル見てみたいです。 64bitならではの簡単な計算の仕方も知りたいです。

  • CASL アセンブラ命令 アプリ機能

    例えば、CASLのアセンブラ命令にDCがある。 LABER DC 100 とすると。 これは、メモリに領域を確保し100をいれる命令だが、プログラムが変更されれば、メモリアドレスは変更される。 CASLには機械語命令・マクロ命令・アセンブラ命令がある。 機械語命令は人に分かりやすいようにニーモニックが付けられているだけだが、 アセンブラ命令はプログラムが変更されればそのアドレスは移動するという、ハンドアセンブリでは、できない機能が含まれている。 アセンブリ言語は色々ありますが、アセンブラ言語は人に見やすいようにニーモニックが付けられているだけでなく、CASLのDC命令のように、ハンドアセンブリではできないアドレスの自動変更のようなアプリケーションとしての機能(OS的機能)も一般にふくまれているとかんがえてよいのでしょうか? よろしく願います。

  • アセンブラに関する質問

    アセンブラに関する質問 現在アセンブラの勉強をしている者ですが2つ質問があります (1)以下のサイトの分岐とジャンプ命令の説明にPC+4という記述があるのですがこれはメモリアドレスを指しているのですか?そうだとしたら、4というのはデータ語長が4バイトだとだからという意味だと思うのですがPCというのは何なんでしょうか? R3000 URI:http://ja.wikipedia.org/wiki/R3000#.E5.91.BD.E4.BB.A4.E3.82.BB.E3.83.83.E3.83.88.E3.81.AE.E6.A6.82.E8.A6.81 (2)レジスタr1がレジスタr2の値より小さいとき処理Aと処理Bをさせる方法はどうしたらいいでしょうか?自分が思うに addi r2, r2, 100 ?←ループの始まりを知らせる命令を用意する 処理A 処理B addi r1, r1, 1 ble r1, r2, ?←ループの始まりに行く値をセットする という命令を書けばいいと思うのですが?の部分の書き方が分かりません。 使用できる無条件、条件分岐命令は以下のものが指定されています。 無条件分岐:j, jr, jal 条件分岐:beq, bne, blt, ble

  • ニーモニックから機械語へ変換する簡易アセンブラ

    ニーモニックから機械語へ変換する簡易アセンブラ 初期のアセンブラにおいて、ニーモニックから機械語への変換はどのようなアルゴリズムで行われていたか知りたいのですが、H8マイコンなどで実際にコードを書いたウェブサイトなどはありますでしょうか? またイメージとしては、メモリに格納された文字コードを1バイトずつ命令変換テーブルと比較し、同じ場合はそのオペコードを出力するといったようなアルゴリズムになると思うのですが、これは正しいでしょうか? 例えば具体的に「MOV A B(BレジスタからAレジスタへの転送命令)」を機械語へ変換する処理を考えると、下記のようになると思います。 [命令変換テーブル] OPコード(1バイト) 文字列長(1バイト) 文字コード : 文字コード を命令数分用意する。 (1)ニーモニックの左端から1文字(1バイト)ずつ、まず命令変換テーブルの最初の命令の文字コードと比較が行われる (2)空白まで全ての文字コードが一致すれば、一致した命令変換テーブルのOPコードを得る (3)一致しない場合は、命令テーブルの次の命令の文字コードと比較していく((1)にループする) (4)命令テーブルの最後まで一致するものがなければエラー 高級言語ではこのような処理はブラックボックスになっていると思いますが、アセンブラレベルでどのように実現されているか解説が見当たらなかっため質問させて頂きました。どうぞよろしくお願い致します。

  • プログラミングについて。

    コンピュータは電圧の高い(H)と低い(L)を2進数としてCPUがクロック信号の入力を受けて処理します。 2進数はそのままだと扱いづらいので、数値的に親和性のある2のn乗進数を使います。 一般にコンピュータは1オクテットを1バイト、1ワードとしています。 その時16進数2桁で1バイトとなることから16進数表記が使われています。 なので、極論で言えば16進数2桁ではなく256進数1桁でも良かったという事です。 実は、大抵のアセンブリ言語は2進数表記を扱えます(8進数も使えるかも)。 アセンブラは16進数でも2進数でもそのまま対応するマシン語に置き換えていくものです。 アセンブリ言語とマシン語は一体一で対応しているので、実行ファイルがあれば、逆アセンブルで完全なアセンブリコードを復元出来ます。 マクロアセンブラの場合はマクロ命令までは再現されませんが、ここでは関係無いので割愛します。 つまり、マシン語とアセンブリ言語は本質的に全く同じものです。 単に、人間に読みやすく見せているものアセンブリ言語です。 マシン語もアセンブリ言語も低水準言語です。 高水準言語とは、C言語などのコンパイルを必要とするものや、BASICやJavaScriptのようにインタープリタを必要とするもののことです。 こちらは、CPUが直接解釈できるマシン語とは全く違う人間の都合に合わせた表現でコーディングし、後からマシン語に変換する仕組みのものです。 人間に読みやいコードをマシン語に変換するので、関係は一体一ではありません。 つまりコンパイルやインタープリットすると元の情報(ソースコード)は失われます。 で、① インタープリタとインタープリットとは何でしょうか?教えていただけないでしょうか?すみません。 ② マクロアセンブラの場合はなぜマクロ命令が再現されないのでしょうか?教えていただけないでしょうか?すみません。 ③ 実行ファイルがあれば、逆アセンブルで完全なアセンブリコードを復元出来ます。とはどういう事でしょうか?つまり、実行ファイルというのは、プログラマーが書いたソースコードのことでしょうか?教えていただけないでしょうか?すみません。 教えていただけないでしょうか?すみません。

  • パソコンのCPUは1ビットなんですか?

    タイトルに書いた質問自体がナンセンスなのかもしれません。 そもそも、ハードとしては16ビットも、32ビットも、64ビットも、もしかして128ビットも無く、単に1ビットものなのではないかと思うようになりました。 要するにCPUは単に1ビットずつ処理するだけで、それを、どの単位(32ビット単位とか、64ビット単位とか)にまとめて運ぶか(何処にって、良くは分かりませんが、演算するところとか、周辺装置とのインターフェイスとか、との間で行ったり来たりするのではないのかな)は、OSが決めることなんでしょうか? そのように考えると、アプリはOSのビット数以下でないとうまく動作しないのだろうと思います。 いや、OSが何回かに分けてやれば、32ビットのOSても、16ビットのOSても、64ビットのアプリを処理できるのかな。 質問がそれてしまいましたが、要するにハードウエアには、たとえば16ビットCPUとか、32ビットCPUなどというものは無く、したがってOSを換えればどんなハードでも64ビットマシンにも、あるいは128ビットマシンにもなるということなのかです。 だから、最新のパソコンを8ビットマシンとして使うこともできるということなのかです。 CPUが1ビットずつ処理すると言ったのは仮の話で、4ビット、8ビット、16ビットなど、いろいろあるのかもしれません。 そもそも、CPUのその辺からして良く分からないのです。 よろしくお願いします。

  • 16バイトアライメントで配置された要素へのポインタ

    非常にトリッキーな質問です。標準のC言語で記述可能かもわかりません。もし可能なら教えてください。 16バイトアライメント配置された要素の先頭アドレスは下位4ビットが0となっています。 そこで、1MBの範囲にある要素へのポインタは本来20ビット必要ですが、下位4ビットが常に0なので、上位16ビットを記憶するだけで十分のはずです。アセンブラで記載すれば可能ですが、Cで、「使うときは、4ビット右シフト」「記憶するときは、上位16ビット」となるようなコードを出力するような記載がわかりません。具体的には、以下のようなアセンブラ結果が希望です。 struct ABC {  struct ABC *next;  int x,y,z;   : } *p,*q; のとき、 q = p->next; は mov ecx,dword ptr p mov eax,word ptr [ecx] slr eax,4 // 使うときは4ビット右シフト mov q, eax q->next = p; は mov ecx,dword ptr q mov eax,p slr eax,4 // 構造体ABCに保存する場合には4ビット左シフト mov word ptr [ecx],eax となってほしいです。

  • このアセンブラの意味を教えて下さい

    アセンブラ初心者です。「はじめて読む486」を読んで勉強しているのですが、いくら調べても分らないのでどうぞ教えて下さい。次の2つのプログラムが分りません。 ------------------------------------------ db 0eah dw offset set_cs_desc2 dw 20h set_cs_desc2: 以下プログラムが続く --------------------------------- セグメント間ジャンプ命令によってCSレジスタに0020hをロードすると本にあるのですが、先ずdb、dwとは何を意味するのでしょうか。単にバイト、ワードを指定しているのでしょうか?そうだとしたらなぜdb、dwと指定しているのか分りません。 また0eah,20hが何を意味しているのか分りません。 出来れば1行ごとに詳しく教えて戴ければ嬉しいです。 また ------------------------------ db 0eah dw offset set_cs_desc3 dw seg set_cs_desc3 set_cs_desc3: move命令などが続く _text ends end ------------------------------------ セグメント間ジャンプ命令によってCSレジスタに_textをロードすると本にはあるのですが、上のプログラムと同様、0eah,db,dwが分りません。 またsegは何を意味するのか分りません。お手数だとは思いますが、これも1行ごとに詳しく解説していただけないでしょうか? そして2つのプログラム共通に分らないのが、なぜこのコードでCSレジスタにロードする事になるのか分りません。 多分意味している事は簡単な事なのだろうと思うのですが、いろいろ調べても全く手がかりがネットや他の本にもなく苦労しています。 初心者なので出来れば簡単な言葉で教えて戴ければ幸いです。 よろしくお願いいたします。