プロが教える店舗&オフィスのセキュリティ対策術

CASIOのポケコンZ-1GRのRET命令について。

いつもお世話になっております。

小生、現在CASIOのポケコンZ-1GRにて8086アセンブリを勉強している、
アセンブリ初心者です。

今回質問させて頂きたいのは、Z-1GRのアセンブリでラベル内にRET命令を記述し、
アセンブル、実行するとZ-1GRが終了してしまう現象についてです。

再現手順は以下のようになります。

1.Z-1GRを起動。

2.CREAR ,200と入力し、エンターキー押下。

3.menuキー押下し、メニュー画面を表示。

4.キー5を押下し、アセンブリモードに推移。

5.キーSを押下し、エディタを起動。

6.下記のプログラムを記述

ORG 2000H
START:
MOV AX, 0001H
MOV DX, 000FH
CMP AX,DX
JC LABEL_1
MOV CX, 000FH
JMP EXIT
LABEL_1:
MOV CX,0001H
RET
EXIT:
IRET
END

7.Shift+menuキーでアセンブリモードに推移。

8.キーAでアセンブル。

9.アセンブル完了画面が表示される。

10.BRKキー押下、monと入力、エンターキー押下。

11.デバッグ画面に推移し、G2000 ,2014と入力しエンターキー押下。

12.Z-1GRが終了する。

以上です。
もしかして、Z-1GRの仕様でラベル内ではRET命令を使えない事になっているのでしょうか?

お忙しい中、大変申し訳ございませんが、先輩方ご教示宜しくお願い致します。

A 回答 (1件)

Z-1GRは使ったことが無いので8086アセンブラの一般論として。


ぶっちゃけた話、RETはスタックに詰まれているアドレスへのジャンプ命令と等価です。
質問のプログラムではスタックに何も積まれていないのでRETの結果として制御が何処に飛ぶのか分かりません。
飛んではいけない不正なアドレス、またはリセットがかかるようなアドレス (0000:0000とか)に飛んでいるのでは?
jcではなくてcallしないとリターンアドレスがスタックに詰まれません。

ORG 2000H
START:
MOV AX, 0001H
MOV DX, 000FH
CMP AX,DX
JC LABEL_2
CALL LABEL_1
LABEL_2:
MOV CX, 000FH
JMP EXIT
LABEL_1:
MOV CX,0001H
RET
EXIT:
IRET
END
    • good
    • 0
この回答へのお礼

BuriBuri4さん、ご回答頂き誠に感謝申し上げます。

BuriBuri4さんにご提示していただいたコードを実行させてみると、
見事Z-1GRが落ちずにプログラムが実行できました。

後、下記の様にプログラムを変更し、実行しても見事実行できました。
ORG 2000H
START:
MOV AX, 000FH
MOV DX, 0001H
CMP AX,DX
JC LABEL_2
CALL LABEL_1
LABEL_2:
MOV CX, 000FH
JMP EXIT
LABEL_1:
MOV CX,0001H
RET
EXIT:
IRET
END

確かにBuriBuri4さんの仰る通り、8086アセンブリの基礎中の基礎を忘れて、プログラミングしていました。
再度、8086アセンブリの勉強を開始致します。

今回は本当にお世話になりました。
心から感謝申し上げます。
ありがとうございました!!

お礼日時:2010/06/02 02:41

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!