以下のコード(途中経過や確認作業中なのでかなりハチャメチャです)でしたいことは、0,1,2の入力で場合分けすることです(0が入力された際にはRockを,1が入力された際にはPaperを,2が入力された際にはScissorsを出力)。
以下のコードでCMPの動作を確認するために
1が入力された際に
MOV BX, DX CMP BX, 0x31 JE label
とすればlabelに飛んでくれるのではないかと考えたのですが、機能してくれません。どこが問題なのでしょうか?
また、上記にしたいことを述べましたが、CMPによって実現できるのでしょうか?
解説よろしくお願いします
ORG 0x100 MOV AH, 0x0a MOV DX, bufstruct INT 0x21 MOV BL,[LEN] MOV BH, 0 MOV BYTE [BUF+BX], '$' MOV BX, DX CMP BX, 0x31 JE label MOV AH, 0x09 MOV DX, CRLF INT 0x21 MOV AH, 0x09 MOV DX, [RPS+BX] INT 0x21 ; プログラムの終了 MOV AX, 0x4c00 INT 0x21 RPS DW ROCK, PAPER, SCISSORS ; アドレステーブル(ポインタが入った配列) ROCK DB 'Rock', 0x0d, 0x0a, '$' PAPER DB 'Paper', 0x0d, 0x0a, '$' SCISSORS DB 'Scissors', 0x0d, 0x0a, '$' CRLF DB 0x0d, 0x0a, '$' bufstruct: SIZE DB 2 LEN DB 0 BUF times 3 DB 0 label: MOV AX, 0x4c00 INT 0x21
どのような実行環境(OS、アセンブラ)なのでしょうか。
ORG 0x100であるとかMOV AX, 0x4c00...INT 0x21などを見ると現代ではまず見ることが無いMSDOSのCOM形式のコードに見えますが。
86アセンブラはいじっていないのでよく知りませんが、AH=0aでint21H(って文字列入力?)のあとDXってなにを持っているのかって規定されてましたっけ?
どんな環境なのかわかりませんが、デバッガでステップ実行してみたりとかはできないのですか?
https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q11245683846
https://teratail.com/help#posted-otherservice
「やむを得ず複数のサイトに質問を投稿された場合は、質問内容にマルチポストをする理由を書き、他のサイトの投稿へのリンクを貼ってください。また、解決した際には必ずteratail及びすべての投稿に解決した旨と、どのように解決したかを記載してください。」
だそうです。「少し違うからマルチポストでない」とか言うかしら? だとしたら、なぜこういうルールがあるか、考えてみてください。
Intel x86系の8086でCPUを操作しています
マルチポストのようですので回答はしませんが、8086のCPUであろうと、INT21HはMS-DOSと言うOSが提供するソフトウェア割込み、ファンクションコールなので、MS-DOSやエミュレーターを含む互換OSでないと動作しませんよ。