RX631スタック領域等を保護するには?

IKUZOと申します、お伺いしたいのですが、
RX631でスタック領域を保護したいのですが、
MPUを使用するのでしょうか?
特権命令例外を使用するのでしょうか?
スタック領域というのは保護可能なんでしょうか?
スタック領域というのは簡単に壊すことができるので、
保護することができれば、安全ではないかと

Parents
  • IKUZOさん、こんにちは。NoMaYです。

    リストファイルどうもです。

    >コンパイラーの最適化が働いているのでしょうか、
    そうです。コンパイラの最適化により t[i ]への書き込みが行われなくなっていますね。

    (1) 2つ前のはコンパイラの最適化によりfor節の内容が以下になっていて、IKUZOさんも気付かれたように、単にループしているだけですので、スタックは壊れないです。

        for(i=0; i<20; i++){
            t[i]=0;
            (void)t[i];
        }
    000017E3 754E14                         MOV.L #00000014H, R14
    000017E6                         L1040: ; bb
    000017E6 601E                           SUB #01H, R14
    000017E8 21rr                           BNE L1040

    (2) 1つ前のはコンパイラの最適化によりfor節の内容が以下になっていて、'A'(0x41)をt[i]に代入したりせず、'A'(0x41)を直接printf()の引数に積んでいますので、やはりスタックは壊れないです。

        for(i=0; i<20; i++){
            t[i]='A';
            printf("%c\r",t[i]);
        }
    000017E5 754614                         MOV.L #00000014H, R6
    000017E8 FB72rrrrrrrr                   MOV.L #_L87, R7
    000017EE                         L1040: ; bb
    000017EE 6080                           SUB #08H, R0
    000017F0 E307                           MOV.L R7, [R0]
    000017F2 3E0141                         MOV.L #00000041H, 04H[R0]
    000017F5 05rrrrrr             A         BSR _printf
    000017F9 6280                           ADD #08H, R0
    000017FB 6016                           SUB #01H, R6
    000017FD 21rr                           BNE L1040

     

Reply
  • IKUZOさん、こんにちは。NoMaYです。

    リストファイルどうもです。

    >コンパイラーの最適化が働いているのでしょうか、
    そうです。コンパイラの最適化により t[i ]への書き込みが行われなくなっていますね。

    (1) 2つ前のはコンパイラの最適化によりfor節の内容が以下になっていて、IKUZOさんも気付かれたように、単にループしているだけですので、スタックは壊れないです。

        for(i=0; i<20; i++){
            t[i]=0;
            (void)t[i];
        }
    000017E3 754E14                         MOV.L #00000014H, R14
    000017E6                         L1040: ; bb
    000017E6 601E                           SUB #01H, R14
    000017E8 21rr                           BNE L1040

    (2) 1つ前のはコンパイラの最適化によりfor節の内容が以下になっていて、'A'(0x41)をt[i]に代入したりせず、'A'(0x41)を直接printf()の引数に積んでいますので、やはりスタックは壊れないです。

        for(i=0; i<20; i++){
            t[i]='A';
            printf("%c\r",t[i]);
        }
    000017E5 754614                         MOV.L #00000014H, R6
    000017E8 FB72rrrrrrrr                   MOV.L #_L87, R7
    000017EE                         L1040: ; bb
    000017EE 6080                           SUB #08H, R0
    000017F0 E307                           MOV.L R7, [R0]
    000017F2 3E0141                         MOV.L #00000041H, 04H[R0]
    000017F5 05rrrrrr             A         BSR _printf
    000017F9 6280                           ADD #08H, R0
    000017FB 6016                           SUB #01H, R6
    000017FD 21rr                           BNE L1040

     

Children
  • NoMaYさん、いつもアドバイスありがとうございます、テストソースを見直してみました

    RX631スタック領域等を保護するには?-3.txt
    int cmd_test(char *str)
    {
    	char t[5];
    	int i;
    	for(i=0; i<20; i++){
    		t[i]=(char)'A'+i;
    	}
    	t[i]='\r';
    	t[i+1]=0;
    	printf((char*)&t);
    	return CMD_OK;
    }

    そうしましたら、動作しているようです

  • NoMaYさん、いつもアドバイスありがとうございます、
    「(1) 2つ前のはコンパイラの最適化によりfor節の内容が以下のみになっていますので
    スタックは壊れないです。」
    「(2) 1つ前のはコンパイラの最適化によりfor節の内容が以下になっていて、
    'A'(0x41)をt[i]に代入したりせず、'A'(0x41)を直接printf()の引数に積んでいますので、
    やはりスタックは壊れないです。」
    コンパイラーの最適化おそるべしですね、なるほどリストに出してみれば、わかるのですね、
    本当にいつもお世話になっています、ありがとうございます。