- 締切済み
アセンブリ言語
アセンブリ言語で,できるかぎり単純な電卓をつくるには,どう記述すればよいのでしょうか。 コマンドプロンプトの以下のコマンドで実行します。 DEBUG -A (ここに記述) -G お願いします!
- みんなの回答 (24)
- 専門家の回答
みんなの回答
- Quant
- ベストアンサー率18% (23/122)
300番地の続きです。 画像を貼り付けるのは初めてなのですがひとつの回答に対して一枚しか貼り付けられないようなので連張りします。 前の回答の画像の説明です。 -a 9000 -- メインルーチンを9000番地から入力しています。 call 100 -- キーボード入力。 call 200 -- サブルーチンにするほどではないのですが、引数などがわかりやすいのでサブルーチンにしました。引数はスタックで渡すほうがいいのですが、スタックの書き込み、読み出しを間違えるとバグがわかりにくいので、blレジスタを使って引数を受け渡しています。 この回答の画像の説明です。 call 300 -- 演算子を識別して演算子によって処理を分けています。 ここでjeのとび先が前もってわからないので仮に300と入れておいて後で修正しています。
- Quant
- ベストアンサー率18% (23/122)
- A88No8
- ベストアンサー率52% (836/1606)
こんにちは No.11の補足です。 3.5インチ フロッピーディスクドライブを持つPCなら、Windows XPの場合、3.5'FDにディスクを入れて、マイ コンピュータで3.5'FDを右クリックして「フォーマット」を選び「MS-DOS の起動ディスクを作成する」を選んでフォーマットすると MS-DOS環境が作れる起動ディスクが得られます。
- A88No8
- ベストアンサー率52% (836/1606)
こんにちは No.7 の関連で。 普通にDOS窓(WinXPでは、コマンド プロンプト)を開くとシェルが CMD.EXE になります。 もしかするとですが、COMMAND.COMをシェルにする環境を作ってDEBUGを動かせば通るかも.. ダメ元で試してみませんか? DOS窓開いてcommand<Enter>か、「ファイル名を指定して実行」でcommand<Enter>です。
- Quant
- ベストアンサー率18% (23/122)
XPでは16ビットのMS-DOSのソフトはエラーになります。DEBUGが動くように書いてあったので、DOSファンクションコールも使えるものと勘違いしていました。 MOV AH,A MOV DX,200 MOV BYTE PTR[200] , 20 INT 21 の部分が引っかかっているのかもしれません。最初のint 21までを実行してみてエラーが出るか確認してください。もしこの部分が原因だとキーボード入力、ディスプレイ出力はあきらめなければならないかもしれません。 Win2000で動作確認してみました。 ただ計算式と答えが同じ行に重なって表示されるので、300番地から答えを書き込む部分の先頭に復帰改行を入れるてやる必要があります。
- A88No8
- ベストアンサー率52% (836/1606)
こんにちは No.5です。 デバッガー上で実行するのが目的なら、完全にはずした回答です。 最終的には、DOS窓のコマンドラインで「ca 1+1[Enter]」のような使い方に持っていくのかなと思いましたのでm(__)m
- Quant
- ベストアンサー率18% (23/122)
失礼間違ったことばかり書いています。 call命令はサブルーチンをメインルーチンに続けて記述する必要が無いのでアドレスは決め打ちできます。サブルーチンを書いてそれからメインルーチンを書くようにすればcall命令は最初から正しいアドレスを書き込めます。 下の回答にも結構間違いがあるかもしれません。雰囲気だけ汲み取ってください。
- Quant
- ベストアンサー率18% (23/122)
当分デバッガで入力していないので忘れていました。 デバッガは先の回答にも書いたとおり、デバックずるツールなのでプログラム実行に使えるというだけなのでちょっと癖があります。 jmp命令やcall命令など飛び先のアドレスを指定する命令を使うときアドレスを入れてやる必要があるのですが、前もって飛び先のアドレスがわからないので、適当に数字を入れておいて後で正確なアドレスに修正してやる必要があります。 ではがんばって挑戦してみてください。
補足
DEBUG -A MOV AH,A MOV DX,200 MOV BYTE PTR[200] , 20 INT 21 MOV AL,BYTE PTR [0202] SUB AL,'0' MOV DL,BYTE PTR [0204] SUB DL,'0' MOV DH,0 MOV BL,BYTE PTR [0203] CMP BL,'+' JE 1 CMP BL,'-' JE 2 CMP BL,'*' JE 2 CMP BL,'/' JE 2 ADD AL,DL MOV BL,AL MOV AH,0 MOV DL,A DIV DL ADD AL,'0' MOV BYTE PTR[300],AL ADD AH,'0' MOV BYTE PTR[301],AH MOV BYTE PTR[302],'$' MOV AH , 9 MOV DX , 300 INT 21 -G コマンドプロンプトでこのようにやってみたんですが,DOS窓内にエラーとでて不正な命令との警告ボックスが表示されてしまいます。何か解決方法はないでしょうか。 スミマセン,お願いします!
- Quant
- ベストアンサー率18% (23/122)
デバッガだとアドレスは自動的に計算して表示されます。 行頭の----のところはデバッガが自動的にアドレスを表示するのですが、No.3に書いたプログラムは解答欄に直接書いたので、アドレスを計算しないとデバッガの出力のようには書けないので手抜きしています。適当な数字を入れてもいいのですが、それでは数字に意味があるようにとられる恐れがあるので棒線にしました。ジャンプ先だけ必要なので番号を入れてあります。 アドレスはハンドアセンブルをするのでない限り計算して出す必要はありません。 ちなみに手計算の仕方はニモニックの表を見ながらやります。 たとえば 0100 je 0200-----チェックの結果イコールなら200番地にジャンプ 0102 次の命令 という命令の場合 jeがマシン語コードで74で1バイト、ジャンプ先の番地を収めるのに1バイト必要とするのでこの命令はメモリを2バイト必要とする命令ということになります。0100番地にje 0200と書き込んだら次の命令は0102番地から始まるというように計算します。 こんなことはデバッガとかモニタ(ディスプレイのことではありません)の無いマイコンキットに手計算で入れるようなときしかやりません。いまどきのマイコンキットだとツールが揃っているようなので、手計算でアドレスを計算するようなことはないでしょう。 マクロアセンブラもラベルが使えるのでアドレス計算をすることはありません。 デバッガは名前の通り虫取りをするツールですから使い方を覚えておいて損をすることはありません。 レジスタやメモリに何が書き込まれているかを確認する。アセンブルするだけでなくこういったことができるのがデバッガなのです。しかも命令を入力するとすぐにアセンブルされます。アセンブラにかける必要もありません。 またマクロアセンブラと違って、擬似マクロなどニモニック以外の余計なものが無いのでシンプルですし、PCの素の姿が見られるのでアセンブラの勉強をするには最適と思います。 ただ電卓程度ならいいですが、これで本格的なプログラムを組むのは無謀です。デバッガでアセンブラがある程度理解できたら、マクロアセンブラに移りましょう。マクロアセンブラよりまだシンプルなアセンブラもありますが、Windows全盛の現状を見るとマクロアセンブラがベストとは言いませんが、ベターな選択肢と思います。
- A88No8
- ベストアンサー率52% (836/1606)
こんにちは >DOS窓で1+1と入力しエンタキーを押すと2とでるといった,最も単純な電卓です この仕様は、「DOS窓で」というのを「DOS窓(のDEBUG上)で」と解釈してました。 デバッガにこだわられていたようなので。 でも、DOS窓で機械語を起動して動かしたいプログラムを作るという場合、COMモデルか、EXEモデルのオブジェクトにしないと実行できません。これらはOSであるところのMS-DOSのメモリ管理に沿った仕様で作ってあげる必要があるので、No.3の回答者さんのお勧めのとおり、MS-DOS用アセンブラを手に入れてプログラミングしてアセンブルした方が現実的だと思います(-.-; で、うまく動かないとき、それこそデバッガでトレースしたりステップ実行させてデバッグするんだもの(^^;
補足
ありがとうございます。実行ファイルにしなくてもGコマンドで実行できると思うんですが。
補足
丁寧にありがとうございます! 記述していただいたコードを参考にやってみて結果を書こうと思います。 頑張ります。