• ベストアンサー

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

ご覧いただき誠にありがとうございます。 タイトルにもありますように、アセンブリ言語でのプログラミングを行っています。 プログラミング自体が初めてで、レジスタの使い方や命令の使い方、メモリについてがテキストを読んでみてもいまいち理解できません。 なんとかモノマネで設問をクリアしましたが、わからないことがあります。 大意は以下の通りです。 「問.生徒の学籍番号と英国数理社の5科目の得点を順に入力する。データ入力を終了する場合は「.」を入力する。最後に入力したデータを表示する。」 以上です。 配列を使うことはわかるのですが、どの命令を使えばよいのかわかりません。 また、順に入力されたデータはレジスタでなくメモリに記憶させないと後で取り出せませんよね。このメモリに記憶させる方法もよくわかりません。アドレスを自分で勝手に決めるのも後でわからなくなりそうでして…。 さらに、人数をカウントする方法もわかりません。フローチャートで人数が増える度に「I+1→I」とするのを、どうやって表現したらよいのでしょうか。 長々と申し訳ございません。 ですが、自力ではかなり大変で、頭がパンクしそうです。どなたか是非ともご教授下さい。わかり易いテキストやホームページなどなんでも結構です。 よろしくお願いいたします。

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

  • ベストアンサー
  • ralf124c
  • ベストアンサー率52% (232/446)
回答No.3

初心者の方がアセンブラだけでこれを実現するとなるとかなり大がかりです。 PCの基本(構成や機能など)が理解できていることを前提として、ポイントは ・命令とレジスタの役割は理解されていますか? ・メモリの概念と役割は? ・4種のセグメントの役割は? ・入出力には、MS-DOS環境ならファンクションコール(システムコール:割り込み命令/入門者にハードウェア割り込みはありえないですよね)について ・DOSのファンクションコールが使えないなら、BIOSコールまたは割り込みおよび割り込みベクタについて また、マクロアセンブラの場合、実際に組んだプログラムを動かすには「アセンブル」という作業の後に「リンク」という作業が必要になります。 遠回りになりますが、フリーのC言語(LSI-C試食版)などで組んで、オプションつきでコンパイル(コード最適化など)してアセンブラソースを出し、読んでみるという手もありますが・・・ 書籍については、昔はPC-98関係で8086アセンブラの良書がありましたがいまでは入手困難かと思います。 古書店などをまわられて自分で確かめるのが一番かと思います。 でも、ハードウェアの基本がわかっていないとアセンブラの学習を初心者が行うというのは無謀ですので、ハードをおさえるか、別の(高水準または高級)言語で一旦学習してソフトの面からアプローチするのが得策かと思います。

noname#30991
質問者

お礼

ご回答ありがとうございました。 やはり、かなり大変そうですね。CPUなどコンピューターの基本や教えていただいたポイントをまず理解したいと思います。

その他の回答 (5)

  • nerosuke
  • ベストアンサー率33% (39/115)
回答No.6

参考書籍として蒲池輝尚氏の「はじめての8086」と「はじめてのMASM」をお勧めいたします。 アセンブリは特に人のコード借りても意味ないですよ。 ある程度の知識がないと絶対わかりませんからね。 お勧めした書籍は共に私自身が読んだ物なので、自信をもってお勧めできます。読みやすく解りやすいです。

noname#30991
質問者

お礼

ご回答ありがとうございました。 仰る通り、自分が理解していないとチンプンカンプンですね… お勧めいただきました書籍は、アマゾンでカスタマーレビューを見ましたが大変好評を得ているようですね。さっそく購入して基礎を身に付けたいと思います。

  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.5

ずいぶんと大変な状況に置かれていることはわかりました。 現在では 16bit のアセンブリプログラミングの資料を手に入れるのは結構大変ですが、 何かしらの入門書を読まれたほうがよいかもしれません。 #4の方の挙げられたリンク先にも何冊か紹介されていますが、32bitの アセンブリプログラミングのも多いですね。 丸っきりの初心者であるなら、「はじめての8086」がよいだろうと思います。 今Amazonで調べてみたら新品が手に入る可能性があります。 http://www.amazon.co.jp/dp/4871482456/ 丸っきりの答えを載せるわけにも行かないしどうしたものか悩んだのですが、 ちょっと書いてみましたので参考にでもしてください。 ただし、1教科だけしか入力/出力しませんし、使えるアセンブラがnasmという やつだったのでMASMとは微妙に書式が違います。 アセンブルが通ることは確認していますが実行はしていません(16bitリンカがなかった)。 bits 16 section .data inputbuffer: maxlen db 80 ; 最大入力長 inputlen db 0 ; 実際の入力長さ bufmain resb 79 ; バッファ本体 ;;bufmain db 79 dup(?) ; masmではこっちの表記 db 0 ; endmark english resb 80 ; masmでは表記が違う len_of_english db 0 japanese resb 80 ; masmでは表記が違う len_of_japanese db 0 math resb 80 ; masmでは表記が違う len_of_math db 0 sience resb 80 ; masmでは表記が違う len_of_sience db 0 social resb 80 ; masmでは表記が違う len_of_social db 0 msg1 db '英語の点数?', 0dh, 0ah, '$' msg2 db '国語の点数?', 0dh, 0ah, '$' msg3 db '数学の点数?', 0dh, 0ah, '$' msg4 db '理科の点数?', 0dh, 0ah, '$' msg5 db '社会の点数?', 0dh, 0ah, '$' section .code main: mov dx, msg1 ; masm では offsetが必要 call putmsg mov dx, inputbuffer ; masm では offsetが必要 call input mov [len_of_english], al ; masmでは[]不要 mov si, bufmain ; masm では offsetが必要 mov di, english ; masm では offsetが必要 mov ah, 0 mov cx, ax cld rep movsb mov dx, english ; masm では offset が必要 mov al, [len_of_english] ; masmでは[]不要 mov ah, 0 mov cx, ax call puts mov ah, 41h mov al, 0 int 21h input: push dx mov ah, 0ah int 21h pop bx mov al, [bx+2] ; masm では 2[bx] ret putmsg: mov ah, 09h int 21h ret puts: mov bx, 1 ; 標準出力 mov ah, 40h int 21h end

noname#30991
質問者

お礼

ご回答ありがとうございました。 おまけにコードまで記述していただき誠に光栄です。 ただ、半分近く意味がわからない状態です…教えていただいた書籍で一から勉強しなおしてから、参考にさせていただきます。

  • PED02744
  • ベストアンサー率40% (157/390)
回答No.4

初めての言語が8086アセンブラで、入出力までこなす。。。 それは、相当困難が伴います。頭がパンクします。 あ、まだ「パンクしそう」でとまってますね。 そもそも、アセンブラだったら、配列なんてありませんから、 アドレスポインタの移動を指定回数繰り返すって事になるんですが、 データ件数無制限みたいだし、OSにメモリ要求IOしたり、それはもう 頭がパンクするほど厄介なことに。。。 とりあえず、アセンブラの参考になるページは http://www5c.biglobe.ne.jp/~ecb/assembler/assembler00.html ここかな? ここを一通り読んだあと、アセンブラMS-DOSの世界というのが下の方に あるので、そこをチェックされるのがよろしいでしょう。 一応、XMSメモリの確保まで書かれているようなので、無制限のデータ件数でも大丈夫でしょう。 それにしても、初めてでこの課題はかなり無茶です。 私だったら、辞めさせたい新入社員にこの課題を出して、できなかったら 「できないのか。おまえ、この会社向いてないんじゃない?」って いって辞めさせるのに使う・・・っていうくらい無茶です(笑)

noname#30991
質問者

お礼

ご回答ありがとうございます。 そんなに無茶な課題なんですか…そりゃ頭はパンクしますね(笑) 教えていただいたページを見てみましたが、非常に丁寧な解説で非常に参考になりそうです。まず、基本をしっかり身に付けてみます。

  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.2

CPUが8086ということだけでは情報不足です。 たとえば >生徒の学籍番号と英国数理社の5科目の得点を順に入力する。 というのがありますけど、OSなどが明確にならなければこの辺の コードは書けません。 8086でアセンブラということで、プラットフォームはMS-DOS アセンブラはMASMあたりでしょうか? > このメモリに記憶させる方法もよくわかりません。アドレスを自分で勝手に決めるのも後でわからなくなりそうでして…。 アセンブラを使うのだから、番地は自分で決めずにラベル振っとけばいい話では? > 人数をカウントする方法もわかりません。フローチャートで人数が増える度に「I+1→I」とするのを、どうやって表現したらよいのでしょうか アセンブリ言語でないプログラミング言語はわかりますか? 変数にあたるメモリ領域を確保して、そこに数値を入れとくだけです。 あまっているならレジスタに割り当ててもかまいませんが。 で、 mov bx, offset var mov ax, [bx] inc ax move [bx], ax のようにすると。 、

noname#30991
質問者

補足

たびたび申し訳ございません。 仰るとおり、プラットフォームはMS-DOSでアセンブラはMASMです。 ちなみにプログラミング言語はアセンブリが初めてです。 よろしくお願いいたします。

回答No.1

何というアセンブリ言語ですか? それを教えてもらえなければ、誰も回答できません。

noname#30991
質問者

補足

失礼しました。8086です。 よろしくお願いいたします。

関連するQ&A