お世話になります。
以下プログラムで、
ビルドツールの設定を最適化なし
E2Liteを使いRL78/G13の実チップにてデバッグ(自動生成ツールの設定=デバッグあり)
ブレーク設定を①、②に設定
にて試しているのですが、
①で、停止後、F5で実行をすると、②で停止する予定が停止せず、
また①に戻ってしまいます(リセットしてしまう)
※シミュレータでは、ちゃんと②で停止します。
void main1(void) //自動生成コードmain からの飛び先
{unsigned char v,x; v=1; //① switch(v){ case 0:x=x+1;break; case 1:x=x+1;break; case 2:x=x+1;break; case 3:x=x+1;break; case 4:x=x+1;break; } while(1){ x=x+1; //② } }
調べると、switch 文は、最適化なしでは、テーブルジャンプコードに
生成されるようで、以下 逆アセンブルの③のところで、BR AX (AXレジスタで示すアドレスにジャンプ)
するはずが、AXの値が0のままになってしまっています。よって、0番地にジャンプするので、リセット時
同様の挙動になってしまう。この理由がわからず困っています。宜しくお願い致します。
void main1(void)
{
_main1: c7 PUSH HL c1 PUSH AX fbf8ff MOVW HL,SP
unsigned char v,x;
v=1;
cc0101 MOV [HL+1H],#1H switch(v){
e1 ONEB A 318e SHRW AX,8H 440500 CMPW AX,#5H de24 BNC $_main1+0x34 12 MOVW BC,AX 490a20 MOV A,200AH[BC] 311c SHLW BC,1H 9efc MOV CS,A 790020 MOVW AX,2000H[BC] 61cb BR AX ;<<<<<<<<<<<<<<<<<③
case 0:x=x+1;break;
8b MOV A,[HL] 81 INC A 9b MOV [HL],A ef12 BR $_main1+0x34 case 1:x=x+1;break;
8b MOV A,[HL] 81 INC A 9b MOV [HL],A ef0d BR $_main1+0x34 case 2:x=x+1;break;
8b MOV A,[HL] 81 INC A 9b MOV [HL],A ef08 BR $_main1+0x34 case 3:x=x+1;break;
8b MOV A,[HL] 81 INC A 9b MOV [HL],A ef03 BR $_main1+0x34 case 4:x=x+1;break;
8b MOV A,[HL] 81 INC A 9b MOV [HL],A }
while(1){
x=x+1;
effb BR $_main1+0x34
}
c0 POP AX c6 POP HL d7 RET