• 締切済み

アセンブリ言語

アセンブリ言語で,できるかぎり単純な電卓をつくるには,どう記述すればよいのでしょうか。 コマンドプロンプトの以下のコマンドで実行します。 DEBUG -A (ここに記述) -G お願いします!

noname#78062
noname#78062

みんなの回答

  • Quant
  • ベストアンサー率18% (23/122)
回答No.24

何か基本的に勘違いしているのではないでしょうか。 なにか複雑な計算式が存在していると思っていませんか。 あのサイトに書いてある以上のものはありませんよ。 あとはニモニックが何バイト必要とするか調べながら電卓片手に足し算していくぐらいしかないと思います。ハンドアセンブルでマシン語を組む時ぐらいしかこんなことはしません。

noname#78062
質問者

補足

 あのサイトの説明の一部の意味が分からないんです。  まず電卓を記述し,次にCOMファイルとして保存するために,BXレジスタをRコマンドで0にするところまではクリアできたんですが,その後のCXレジスタをRコマンドで データのサイズ - 100 とするという部分です。  「オフセットアドレス-----で終わっているなら,...」とあるので,コードの最後が「 15F2:010B INT 21 15F2:010D 」となっていたら,最後のオフセットアドレスつまり010Dから何か計算し,「 -R CX CX 0000 : 」の後に入力するんですよね? 010Dから100をひいたものって事ではないですよね。 .

  • Quant
  • ベストアンサー率18% (23/122)
回答No.23

この2日にwin2000が逝ってしまいました。蘇生を試みたのですが無理でした。使える臓器は移植にまわす予定です。 ということでデバッガが使える環境がなくなってしまいました。 No.1の補足に書いてあるサイトには電卓のコードを書くために必要な情報がすべて入っているように思います。 あのサイトを参考に挑戦してみてください。

noname#78062
質問者

補足

COM保存についてサイトを見ても, -R CX CX 0000 :24 のところで,ここでは24になっている部分 の求め方がどうしても分かりません。どうかその部分だけは詳しく教えていただけないでしょうか。お願いします。

  • Quant
  • ベストアンサー率18% (23/122)
回答No.22

このコードは100行程度の短いものなので毎回頭の中で考えながらデバッガでメモリに書き込んでいます。uコマンドでリストをとって確認し間違いを見つければ修正します。最後に修正した箇所の最後が表示されているだけです。下に付け加えたと言うより、サブルーチンのバグ取りの名残です。

noname#78062
質問者

補足

確かここで添付できるのは画像や音声だけですよね。勝手なお願いですみませんが,No.19のコードのCOMファイルを,送っていただく事はできないでしょうか。 ファイル送信フォームURL http://www.d1.i-friends.st/index.php?in=SHTML&pan=24

  • Quant
  • ベストアンサー率18% (23/122)
回答No.21

バイトの計算のやり方はあのサイトに書いてあります。そのやり方で実行ファイルにしてみました。win2000で動くのでXPでも動くと思います。 64ビットのXPでは動きませんでした。 実行結果を張っておきます。

noname#78062
質問者

補足

画像の, 357A:0199 ret 357A:019A… の部分は,No.19で記述していただいた電卓の下に付け加えたという事でしょうか。

  • Quant
  • ベストアンサー率18% (23/122)
回答No.20

私もすべて独学でアセンブラを習得しました。誰でも最初は知識が少なく理解するのに時間がかかります。ただやっているうちに知識は増えていきます。 No.1の補足に書かれたサイトはコンパクトにまとめられています。まだこのサイトに書いてあることの大半が理解できないと思いますが、このサイトのサンプルをすべて入力して動かしてみれば、少しずつわかるようになってくるはずです。 No.19の補足に書かれた資料はこのサイトのものですね。書いてある通りにやってみましょう。debugが動いているのできっと動くでしょう。 16ビットのプログラムが動かないのは、64ビットXPだけではないかと思います。32ビットのXPではまだ16ビットのプログラムは動くのだと思います。 私自身が64ビットのXPなので動かないと勘違いしていただけのようです。 私の書いたプログラムをCOMモデルとして保存するのはこのサイトに書いてあることが理解できれば簡単にできるはずです。保存するバイト数が違うだけでやり方は同じです。 保存のやり方はこのサイトに書いてあること以外の説明はありません。私が説明したとしてもこのようになります。 No.19のコードは減算、乗算、除算を追加しやすいようにNo.3を書き換えたものです。COMモデルとして保存するにはアドレスを詰めないと無駄が多くなります。 No.3のコードの方が保存バイト数を計算するのは楽でしょう。ただこれもデータの保存先などのアドレスを詰める必要はあります。

noname#78062
質問者

補足

その,バイト数はどう求めるのでしょうか。サイトにもありません。

  • Quant
  • ベストアンサー率18% (23/122)
回答No.19

No.3に書いたコードはN0.6にも書いたように回答欄に直接書いたので、そのままでは動きません。アドレスも入っていないし、注釈に入れたように'0'などでエラーが出れば文字コードに変更しないと動きません。 '0'のようにシングルクォーテーションで括っているものは文字です。デバッガでは使えないようですから、文字コードを入れてください。文字コードはIMEツールバーの文字一覧で半角英数を選び各文字の上にマウスカーソルを持っていくとポップアップで表示されます。MS-DOSなのでシフトJISのコードを入れてください。 je 1などもデバッガでアドレスを確認して修正する必要があります。 これらはすべてクリアしていたものと思っていました。添付画像でその手順を読み取ってもらえていたものと勘違いしていました。 下のコードをdebugからここまでと書いてある前の行までコピーしDOS窓に貼り付けてみてください。debugを起動する必要はありません。 アンダーカーソルが表示されたところで1+2などのようにひつ桁の加算の式を入れてエンターを押してください。答えが表示されると思います。 このコードは添付画像の手順でデバッガでコードを入力してバグ取りをしながら並行してメモ帳で作成したものです。 debug a 100 mov ah,a mov dx,9100 mov byte ptr[9100],20 int 21 ret a 200 sub bl,30 ret a 300 mov bl,byte ptr[9103] cmp bl,2b je 318 cmp bl,2d je 31a cmp bl,2a je 31a cmp bl,2f je 31a add al,dl ret a 400 mov ah,0 mov dl,a div dl mov byte ptr[9200],0d mov byte ptr[9201],0a add al,30 mov byte ptr[9202],al add ah,30 mov byte ptr[9203],ah mov byte ptr[9204],24 mov ah,9 mov dx,9200 int 21 ret a 9000 call 100 mov bl,byte ptr[9102] call 200 mov al,bl mov bl,byte ptr[9104] call 200 mov dl,bl call 300 call 400 mov ah,4c mov al,0 int 21 g =9000 9021 ここまで。

noname#78062
質問者

補足

丁寧な解答ありがとうございます,知識不足ですみません,試してみます。  最後に,このように記述したプログラムの保存について以下の資料があるのですが,例えば記述していただいた電卓の場合どうするのでしょうか。また,資料は Intel 80x86 互換プロセッサ / 16bit 用なのですがXP(32bit)のコマンドプロンプトだと違うのでしょうか。お願いします。 [資料] COMファイルの生成はオフセットアドレス100からプログラムを作るがWコマンドでアドレスを指定する場合はどこからでも良い。最後は4C番のシステムコールで終了するようにプログラムする。BXレジスタをRコマンドを使って0にする。CXレジスタをRコマンドでデータのサイズ- 100とする。例えばオフセットアドレス12Cで終わっているならばCXレジスタに2Cをセットしこのサイズはプログラムだけではなくデータも含める。Nコマンド指定。Wコマンド実行(-W [address])。addressには書き始めるアドレスを指定。アドレスを省略するとCS : 100からBX : CXのバイト数だけプログラムをディスクに書きこむためBXレジスタを0にCXレジスタをサイズ- 100に設定する必要がある。 [例(1)] -A 100 MOV AH , 9 MOV DX , 10D INT 21 MOV AH , 4C MOV AL , 0 INT 21 -E 10D "Kitty on your lap$" -R BX BX 0000 :0 -R CX CX 0000 :24 -N chlorine.com -W

  • Quant
  • ベストアンサー率18% (23/122)
回答No.18

終了番地は最後のint命令の次の行のアドレスを入れてください。そうするとint 21まで実行されます。 デバッガは開始番地と終了番地を指定して使います。終了番地のことをブレークポイントと言います。プログラムはこのブレークポイントまでではなく、その手前まで実行されます。 もともとデバッガはプログラムのバクを取り除くためのツールです。バグのありそうな箇所を指定して実行し、うまく動くか調べるものです。常にブレークポイントを指定して使うようにしてください。 開始番地と終了番地は必ず各行に表示されているアドレスを入れてください。それ以外のアドレスを入れると実行エラーになることがあります。 たとえば 100 mov ah,9 102 mov dx,200 105 int 21 107 となっていた場合、 g =100 107 でint 21まで実行されます。 g =101 106 とするとエラーが出たり、別な動作をしたりします。 要は開始番地がずれているとCPUが別な命令と解釈して実行してしまうからです。終了番地がずれていても同じです。

noname#78062
質問者

補足

DEBUG→改行→-A 100→改行→解答7への補足に書いたものをMOV BL,ALを消してコピー&ペースト→改行→-G =(メモリアドレス) とやりましたが,貼り付けた時点でまず SUB AL,'0' からエラーがでます。原因は何でしょうか。

  • Quant
  • ベストアンサー率18% (23/122)
回答No.17

エラーの原因について書くのを忘れていました。 まずコードは100番地以降に書いてください。0からFF番地まではプログラムを実行するためのワークエリアに使われていたと思います。 jeなどのジャンプ命令の番地を間違えると実行エラーになります。 gコマンドの実行範囲は確実に指定してください。これも実行エラーの原因になります。 これぐらいしか思いつきません。コードをもう一度見直してください。

noname#78062
質問者

補足

ありがとうございます。100番地以降なのでまず,-A 100 と記述し,No.7の解答への補足に書いたものを(MOV BL,ALを消して)貼り付けますよね? その後 -G =100 ... ここ(...)で記述する数字はどのようにすれば良いのでしょうか。

  • Quant
  • ベストアンサー率18% (23/122)
回答No.16

最後です。 400番地のルーチンの続きと実行結果が表示されています。 ちょっと見えにくいかもしれませんが、これが大まかな流れです。

noname#78062
質問者

補足

コマンドプロンプトでDEBUG→改行→-A 100→改行→解答7への補足に書いたものをMOV BL,ALを消してコピー&ペースト→改行→-G =(メモリアドレス) とやりましたが,まず SUB AL,'0' からエラーがでます。

  • Quant
  • ベストアンサー率18% (23/122)
回答No.15

u 300 31a -- うまく修正してあるか確認しています。 400番地からは答えを9200番地に書き込むルーチンです。 9200番地に復帰コード、9201番地に改行コードを入れて入力した式に答えが重ならないようにしています。

noname#78062
質問者

補足

<!-- 犾<!--

関連するQ&A

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

    アセンブリ言語がアセンブラ&実行出来るサイトを知らないでしょうか?また、アセンブリ言語のプログラムが載っているサイトを知らないでしょうか?教えて頂けると幸いです。

  • レジスタが変化しない アセンブリ

    アセンブリ言語の勉強を始めた者なのですが レジスタの値が普通のMOV命令で変化しません。 何か初歩的なミスを犯しているのでしょうか、どなたかご教示願います。 環境はXPSP3,Core2DuoE8500に、コマンドプロンプトからDEBUGコマンドを使って学習しています。 0100:MOV ax,FF 0103:(空白) -G 100 103 として実行してみるのですがAXレジスタ内の値が0000のまま変化しないのです。 昨日やったときは普通に出来たような気がしたのですが、、 命令を MOV ax,0222 MOV bx,0222 としたときのスクリーンショットを撮ってみましたので付けておきました。 何かきっと初歩的なミスだと思うのですが、どなたかお願いいたします・・。

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

    アセンブリ言語と機械語は一対一で対応しているので、実行ファイルがあれば逆アセンブルすると 完全に元のアセンブリコードが復元できるのでしょうか?教えていただけないでしょうか?すみません。

  • アセンブリ言語について

    現在電気工学科の学生です。アセンブリ言語の講義を受けているんですが、試験で単位が取れる自信がありません。。。全くわからないことだらけです。C言語に関してはほんの触りだけ勉強したことがありますが、アセンブラ言語については全くの素人です。演習問題があるんですが、色々本等で探しても見つかりませんでした・・・私の努力不足かもしれませんが、問題の解答と解説を教えて欲しいです。 問題は→メモリアドレス3000H~30FFHの内容(データ)を2000Hから始まるメモリアドレスにコピー(格納)するプログラムをアセンブリ言語で書いてください!それとこの問題には参考のためにアセンブリ言語の命令の例があるんですが LD A、(BC) LD A、(DE) LD A、(HL) って書いてあるんですが、このBCやDE,HLはどんな意味があるんでしょうか?初歩的なことばかりで申し訳ありませんが、ご教授よろしくお願いします。

  • アセンブリのファイル操作のエラーに関する質問

    使っている開発環境は、MSDOSプロンプトの、「DEBUG」コマンドなんですが以下のプログラムを実行した所 「共有違反です。読み取り中のドライブ:C  中止(A) 再試行(R) 失敗(F)?」 とエラーメッセージが出ました 私は、失敗を選んだのですが、AXに、エラーコードの「5」 が戻されていました、 これは、MSDOSのDEBUGコマンドが強制的にエラーを起したのでしょうか、それとも私が書き間違えたエラーなのでしょうか ↓が、アセンブル(コンパイル)しようとしたソースです (ソースをかくまえの、コマンドによるメモリへのストアも含む) E 200"C:\testtest0" A 100 MOV AH,3C MOV DX,200 MOV CX,0 INT 21 この後に「G]コマンドで実行

  • アセンブリ言語で

    if( a == b){ …… } else { …… } というのをアセンブリ言語にするなら、 beq を使うより bneを使う方が効率が良いと、ある本に書いてあったのですが、なぜですか???

  • アセンブリ言語は原始プログラムですか?

    質問(1) アセンブリ言語というのは、 add $S1, $S2 みたいなやつですよね? wikipediaで「ソースコード(ソースプログラム、原始プログラム)」の注釈1,2を読むと、 注1:【機械語の命令に記述するアセンブリ言語(アセンブラ)が存在するが、このアセンブラ用の文字列で記述されたプログラムはソースコードとは呼ばれないのが普通である。】 注2:【アセンブリ言語で書かれたプログラムはソースコードと呼ばれない】 と書かれてあります。 でも、 他の教材では アセンブリ言語で書かれたプログラム(原始プログラム) と書かれています。 どっちが正しいのでしょうか? 質問(2) 目的プログラム(オブジェクトプログラム)とは、 IT用語辞典によると 【オブジェクトプログラムとは、ソースプログラム(人間が認識できるプログラム言語で高水準言語など?)をコンパイラで機械語に翻訳したプログラムのことである】 とありますが、 ソースプログラムをコンパイラで翻訳するとアセンブリ言語になるんではないのですか? そのアセンブリ言語をアセンブラで翻訳して機械語になるのではないのでしょうか? どなたかご教授ください。 お願いします。

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

    熱血!アセンブラ入門という書籍を借りてきたのですが、どこから、アセンブリ言語が組めるものをダウンロードすれば良いのでしょうか? また、また、そのダウンロードしたものは、独習アセンブラという書籍でも使えるのでしょうか?教えていただけると助かります。すみません。以下のURLです。 http://kozos.jp/books/asm/menu.html

  • 64ビットWindows上でアセンブリ言語

    こんにちは。 現在、OSは現在、64ビット版のWindows7を使っています。 このWindows7上で、アセンブリ言語によるプログラミングを行いたいと思っています。 どうして今頃アセンブリ言語なのかといいますと、会社の研修で、C言語による組込みソフトウェア開発を学ぶ際に、アセンブリ言語も学習するらしいので、少し予習してみようと思いました。 そこで、64ビット環境でも動作するアセンブラを探してみたのですが、 なかなか見つからず、困っています。 ネット上の情報を頼りに色々と試したのですが、作成した実行ファイルをいざ実行しようとすると、「64ビット環境では動作しない」といった内容のメッセージが出たりして、 どうしても動作してくれませんでした。 64ビット版のWindows上で、アセンブリ言語によるプログラミングができている方がいらっしゃれば、どうやってできたのかを、是非教えて頂きたいです。 必要であれば、インストールすべきソフトウェアの一覧と、環境設定方法なども、簡単に説明して頂ければ、大変助かります。 あと、動作確認を行う簡単なサンプルプログラムも、提示して頂ければ大変助かります。 (なにせ、アセンブリ言語に関する知識がゼロなものですので。) では、よろしくお願い致します。

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

    アセンブリ言語と機械語は一対一で対応しているので、実行ファイルがあれば逆アセンブルすると 完全に元のアセンブリコードが復元できるのでしょうか?教えていただけないでしょうか?すみません。教えていただけないでしょうか?すみません。どういった例が挙げられますか?