• 締切済み

アセンブリ言語

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

みんなの回答

  • 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