• 締切済み

MASMの擬似命令「ASSUME」について

こんにちは。 アセンブラのMASM でプログラムを作っているのですが、サンプルプログラムで、 「ASSUME CS:_TEXT」という表現があるのですが、これは一体どういう意味なのでしょうか? よろしくご回答のほどお願いいたします。

  • kigin
  • お礼率64% (37/57)

みんなの回答

  • kaoaru0
  • ベストアンサー率0% (0/0)
回答No.3

MASMのバージョンにより内部処理が異なるかもしれませんが、これは「CS(コードセグメント)に_TEXTという名前を使うよ!」と言っているだけで、これだけでは何も起きません。 プログラム中でCS(コードセグメント)を操作するようなことをすると、それを検出してワーニングとして教えてくれます。ただそれだけなんです。 他に何かしてくれるのか?っていったら何もしてくれないのです。今、これを気にしているくらいならそんなに大きいアプリケーションをアセンブラで作成したことがないのだと思うのですが、ソースリスト数 がたくさんあった場合に、アセンブルエラーの追跡に役立つということはあります。 そんなに気にする問題ではありません。それよりもたくさんプログラムを書いてスキルアップに励んでください。

  • Takochu
  • ベストアンサー率53% (82/154)
回答No.2

こんばんは。 私もちょっと忘れてしまい、参考書を見て復習しました。 セグメントについては、分かっていらっしゃいますよね。 ASSUME 文は、セグメントレジスタとセグメントとの対応を、 MASM に教えることにより、正しくアセンブルするための擬似命令です。 つまり、“ASSUME CS:_TEXT”の場合、 「CSレジスタは、_TEXTセグメントを指していますよ。」 と MASM に宣言しているのです。 (この文で実際に、セグメントレジスタに値が代入されるわけではありません。) この宣言がないと、MASM がアセンブルするとき、データラベル等の アドレスの計算が正しくできなくなります。 だから、実際にセグメントレジスタに値をセットする場合は、 その前に、この文を宣言する必要があります。

  • barbieri
  • ベストアンサー率24% (19/78)
回答No.1

こんばんは。 すっかり忘れてしまいましたが、こういう意味だったと思います。 コードセグメントは_TEXTですよ。とある種の宣言をします。 ご存じのように8086は8080系の資産を継承できるように64KBのセグメントの概念があります。 勿論、ESを別セグメントにASSUMEすることも可能です。 COMモデルの実行プログラムを作成するために、すべてのセグメントを同一にするのが一般的です。 セグメントの宣言をしておかないと最終的にEXE2BINでEXEモデルからCOMモデルに変換できません。

関連するQ&A

  • masm32がうまく動きません。

    アセンブリ言語を学ぼうとmasm32をインストールしました。 インストール手順は下記のように行いました。 ・masm32を C:\ にインストール ・masm32のbinフォルダの中にあるlink.exeをlink32.exeに名前を変更し、16bitリンカLINk.exeをbinフォルダに投入 ・システム環境変数に SET PATH=C:\MASM32\BIN;%PATH% SET INCLUDE=C:\MASM32\INCLUDE;%INCLUDE% SET LIB=C:\MASM32\LIB;%LIB% を書き加える。 ソースをC:\に保存し、アセンブラしてみると C:\>ml /c /Fl test.asm 'ml'は内部コマンドまたは外部コマンド、 操作可能なプログラムまたはバッチファイルとして認識されていません。 と出ます。 ソースの保存場所をC:\masm32\binに変えて C:\masm32\bin>ml /c /Fl test.asm の形でアセンブラすることはできます。 ソースをC:\に保存した状態でアセンブラできない原因は何が 考えられるでしょうか?

  • Segment情報の取得と設定

    始めまして,宜しくお願いします. 現在,Microsoft Visual C/C++ と MASM で作成された サンプルプログラムを使用してビデオカードの動作検証をしていますが, アセンブラが殆ど解らない上ハード寄りのプログラミング経験が乏しく, 取得/設定したい情報を思うように操作できません. 今後,コードをカスタマイズするにあたり, (特に高速動作を期待するわけではないので) 可能な部分はCへ置き換えたいと思っています. MASMで下記のように記述された動作をCで記述するにはどうすればよいでしょうか. ;------------------------------------------ move ax, xxxxxh move es, ax ; es -> VRAMセグメント xxxxxh assume es: nothing 中略 move es:[di], bl ; blに格納されているデータをVRAMに設定 ;------------------------------------------ セグメントの取得についてFP_SEG(),FP_OFF()関数 を使用すれば良いのかと考えていますが上手く扱えません. 宜しくご教授願います.

  • アセンブリ言語について教えて下さい。no.2

    ご覧いただきありがとうございます。 前回の質問に続き、アセンブラについてお聞きしたいと思います。 前回ご回答を下さった方には非常に感謝しております。またよろしくお願いいたします。 「page擬似命令」と「2つのファイルをリンクさせる方法」が知りたいのですが、参考書等を拝見してもよくわかりません。 どなたかご教授下さい。 ちなみにアセンブラは8086のMASMです。 よろしくお願いいたします。

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

    アセンブラ初心者です。「はじめて読む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レジスタにロードする事になるのか分りません。 多分意味している事は簡単な事なのだろうと思うのですが、いろいろ調べても全く手がかりがネットや他の本にもなく苦労しています。 初心者なので出来れば簡単な言葉で教えて戴ければ幸いです。 よろしくお願いいたします。

  • 昔のLSIゲームはマイコンで動いていたのでしょうか

    小学生の頃買ってもらった、バンダイのLSIゲーム「ミサイルインベーダー」はどのようなLSIを使っていたのでしょうか。単なる集積回路ではなく、プログラム可能なマイコンだったのでしょうか。 これです。この音覚えています。 https://www.youtube.com/watch?v=4CeYkrx8ARw 私は、Z80のアセンブラで入門し、PC-9801シリーズでMASMを使った世代です。

  • 「@$変数」の「@の意味は?」

    PHPの勉強中です。 サンプルプログラムを見ていて以下の「@」の意味がわかりません。 ------------------- // 入力内容を取得する $text1 = @$_POST["text1"]; if (strlen(@$text1) < 4 or strlen(@$text1) > 8) { echo "<p>4~8文字以内でお願いします"; } --------------------- マニュアルには「式の先頭につけるとエラーを非表示」と有りますが、変数の前につけるのはどういう意味があるのでしょうか? 試しに@を全て消しても同じ結果でした。 アドバイスよろしくお願いします。

    • ベストアンサー
    • PHP
  • アセンブラできません。

    初心者です。 アセンブリ言語で1~9の数字を連続的に表示するプログラムを書いたのですが、アセンブラする時 「error A2016 expression expected」というエラーメッセージが出てアセンブラすることができません。 プログラムの内容は下記↓のものです。 何が原因でしょうか? CODE SEGMENT ASSUME DS:CODE,CS:CODE,ES:CODE,SS:CODE ORG 100h START: mov bl,30h jmp aa aa: mov ah,02h mov dl,bl int 21h mov ah,06h mov dl,0ffh int 21h jnz bb: mov ah,02h mov dl,08h int 21h inc bl cmp bl,39h ja START jmp aa bb: int 20h CODE ENDS END START

  • 昔のプログラムを今のPCで

    PC-9801時代にアセンブラで作ったプログラムが多数あります。 当時、常駐プログラムやタイマー割り込み、直接I/Oポートをたたくプログラムも作っていましたが、当然現在のパソコンでは動きません。ただ、MS-DOSの標準入出力のみを使ったプログラムなら、今のWindowsパソコンでも動く可能性がありますよね? お聞きしたいことが3点あります。 ・Windows7のコマンドプロンプトで当時のEXEファイルを実行すると、突然日本語表示が英語モードになって文字化けしてしまうのですが、この原因はなんでしょうか。 ・タイニーモデル(拡張子 .com)ってそもそも動くのでしょうか。 ・これらをアセンブルできる環境は今でもありますでしょうか。  (MASMのソースは無理だとしても、多少の修正でOKならそれでもいいです。)

  • 再帰関数のインライン展開

    再帰関数のインライン展開は出来るのでしょうか? もし、出来るようならアセンブラではどのように表現されているんですか? C以外の言語でも、再帰関数のインライン展開が出来るプログラム言語があれば教えてください。

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

    kigin と申します。 アセンブラの擬似命令に「align」というものがありますがこれは一体どういう意味なのでしょうか? また、アセンブラの擬似命令やアセンブラプログラミングに関して詳しいガイダンス的な紹介がなされているホームページ等がありましたら、教えていただきたいのですが。 よろしくお願いいたします。

専門家に質問してみよう