2013年5月20日月曜日

armcmm立ち上げてソースを書き換える

前回、armcmmを立ち上げたら



 130520A.c          Fキーで検索:                      lキーでヘルプ
 行番号:ファイル名:年/ 月/日(曜) 時:分:秒 サイズ タイトル
0002: 000hina .c 2013/May/20(Mon)14:21:38 84 ひな型Hello
0003: 130520A .c 2013/May/20(Mon)14:23:01 84 ひな型Hello
0004: 8q1     .c 2013/May/18(Sat)09:29:39 1044 #include <stdio.h>
0005: ango    .c 2013/May/08(Wed)15:37:45 2608 #include <stdio.h>
0006: armcmm  .c 2013/May/10(Fri)14:06:24 90979 エディタ作成(自
0007: armcmm-130510b.c 2013/May/10(Fri)14:06:24 90979 エディタ作成(自
0008: armcmm-130510c.c 2013/May/10(Fri)21:09:50 90979 エディタ作成(自
0009: calc1   .c 2013/May/19(Sun)12:55:26 2577 #include <stdio.h>
0010: calc2   .c 2013/May/19(Sun)13:32:35 2957 #include <stdio.h>
0011: calc3   .c 2013/May/19(Sun)19:17:24 4181 #include <stdio.h>
0012: kisi1   .c 2013/May/18(Sat)09:37:56 1061 #include <stdio.h>
0013: lucas10 .c 2013/May/16(Thu)17:30:44 11865 #include <stdio.h>

というような画面がでると思います
方向キー上下で移動して

0006行目のarmcmm.cにカーソルを合わせ
eボタンを押します

eボタンで編集で、ソースが見れます

CTRL+xで終了:[縦1,横1]
CTRL+lでhelp:
00001:036:/*エディタ作成(自分自身)*/⍗
00002:024:#include <sys/syscall.h>⍗
00003:019:#include <unistd.h>⍗
00004:000:⍗
00005:016:#ifdef __linux__⍗
00006:025:# include <linux/types.h>⍗
00007:032:/* # include <linux/dirent.h> */⍗
00008:026:# include <linux/unistd.h>⍗
00009:019:# include <errno.h>⍗
00010:005:#else⍗
00011:020:# include <dirent.h>⍗
00012:006:#endif⍗
ファイル名:armcmm.c

28行目に方向キー↓で移動して

CTRL+xで終了:[縦27,横1]
CTRL+lでhelp:
00023:025:/* #include <curses.h> */⍗
00024:000:⍗
00025:030:#define VER     "2013.05.10.B"⍗
00026:043:#define T57     57   /*1行の文字列*/⍗
00027:045:#define TC47    43   /* カーソルの色 */⍗
00028:047:#define TA      12   /* 編集画面の行数*/⍗
00029:040:#define cls()           printf("\33[2J")⍗
00030:052:#define locate(x,y)     printf("\33[%d;%dH",y+1,x+1)⍗
00031:043:#define tc(n)           printf("\33[%dm",n)⍗
00032:018:#define AMAX 14096⍗
00033:015:#define BMAX 80⍗
00034:002:/*⍗
ファイル名:armcmm.c

編集画面の行数を12から好きな数字に変えます
16くらいがいいかも

数字を変えたらCTRL+Xで編集画面を閉じます
最初の画面に戻ったら
wボタンを押してコンパイル

不具合があればCTRL+Xを2回押してください

Lボタン(Lキー)またはCTRL+Lでヘルプです


armcmmの使い方を少しずつ説明してゆきたい

ダウンロード ↓↓↓

armcmmのあるarm1305b2.zip

僕が作った
armcmmについて説明してゆきたい

synapticマネージャーで
libncurses5-devというライブラリをダウンロードしてください

「armcmmのあるarm1305b2.zip」ってかいてある所を
クリックしてダウンロードそして解凍

端末にて
$ cat g
$ sudo chmod 777 g
$ ./g armcmm
$ ./g ocp

うまくいかないときは

$ gcc -o armcmm armcmm.c
$ gcc -o ocp ocp.c

として

$ ./armcmm

を実行します

逆ポーランド表現のパーサとその演算Ver.3



バージョン2から3への変更点

ヘルプの追加
ビット積、ビット和、ビット排他 演算の追加

実行結果:

akira@akira:~$ cd arm1305b
akira@akira:~/arm1305b$ ./calc3

(q) is quit,(h) is help;  Calc: h

Calc Program  Ver.3 (2013.5.19)
Example:
   Calc: 3*(1+2+3+4)/2
   Calc: 2*(3*(567+433)/300+15)+17
(+)足し算(-)引き算(*)掛け算(/)割り算(%)余り
(<) 1<3と入力すると 1<<3=8左シフト
(>)64>3と入力すると64>>3=8右シフト
(&)ビット積(|)ビット和(#)ビット排他,内部では{^}
(^)2^3で2の3乗 (q)quit (h)help
CTRL+C で強制終了します  入力は整数のみです

(q) is quit,(h) is help;  Calc: 134|345
134@345@|
134|345=479.000000

(q) is quit,(h) is help;  Calc: 456&444
456@444@&
456&444=392.000000

(q) is quit,(h) is help;  Calc: 1123#1156
1123@1156@#
1123#1156=231.000000

(q) is quit,(h) is help;  Calc: q
akira@akira:~/arm1305b$





#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>

/*
逆ポーランド式のパージング

参考資料:

技術評論社 河西 朝雄 著
C言語による はじめてのアルゴリズム入門
2718円+税
P252〜254より引用

技術評論社 奥村晴彦 著
C言語による最新アルゴリズム事典 2330円+税
P72〜73より引用・改変

*/


int ch,ii,jj;
char p[100]="",polish[100];

void readch();
void expression();
void term();
void factor();
double v[50];
int sp1;

main(){
   int i,m,flg;

START:
   ii=0;jj=0;
   printf("\n(q) is quit,(h) is help;  Calc: ");
   scanf("%s",p);

   if(p[0]=='q'||p[0]=='Q') exit(1);
   if(p[0]=='h'||p[0]=='H'){
      printf("\nCalc Program  Ver.3 (2013.5.19)\n");
      printf("Example:\n");
      printf("   Calc: 3*(1+2+3+4)/2\n");
      printf("   Calc: 2*(3*(567+433)/300+15)+17\n");
      printf("(+)足し算(-)引き算(*)掛け算(/)割り算(%%)余り\n");
      printf("(<) 1<3と入力すると 1<<3=8左シフト\n");
      printf("(>)64>3と入力すると64>>3=8右シフト\n");
      printf("(&)ビット積(|)ビット和(#)ビット排他,内部では{^}\n");
      printf("(^)2^3で2の3乗 (q)quit (h)help\n");
      printf("CTRL+C で強制終了します  入力は整数のみです\n");
      goto START;
   }

  do{
      readch();
      expression();
   } while(ch!='\0');
   p[ii]='\0';
   polish[jj]='\0';

   sp1=0;flg=0;
   for(i=0;i<jj;i++){
      printf("%c",polish[i]);
      if(isdigit(polish[i])){
         if(flg==0){
            flg=1;
            v[++sp1]=polish[i]-'0';
         }
         else v[sp1]=v[sp1]*10+polish[i]-'0';
       
      }
      else if(polish[i]=='@') flg=0;
      else{
         flg=0;
         switch(polish[i]){
            case '+': v[sp1-1]+=v[sp1]; break;
            case '-': v[sp1-1]-=v[sp1]; break;
            case '*': v[sp1-1]*=v[sp1]; break;
            case '/': v[sp1-1]/=v[sp1]; break;
            case '^': v[sp1-1]=pow(v[sp1-1],v[sp1]); break;
            case '%': m=(int)v[sp1-1]%(int)v[sp1];
                       v[sp1-1]=(double)m;
                       break;
            case '<': m=(int)v[sp1-1]<<(int)v[sp1];
                       v[sp1-1]=(double)m;
                       break;
            case '>': m=(int)v[sp1-1]>>(int)v[sp1];
                       v[sp1-1]=(double)m;
                       break;
            case '&': m=(int)v[sp1-1]&(int)v[sp1];
                       v[sp1-1]=(double)m;
                       break;
            case '|': m=(int)v[sp1-1]|(int)v[sp1];
                       v[sp1-1]=(double)m;
                       break;
            case '#': m=(int)v[sp1-1]^(int)v[sp1];
                       v[sp1-1]=(double)m;
                       break;
         }
         sp1--;
      }
   }
   printf("\n%s=%f\n",p,v[1]);
   goto START;
}

void readch(){
     /* if((ch=p[ii++])=='\0') return;*/
   ch=p[ii++];
}

void expression(){
   term();
   while(1){
      if(ch=='+'){      readch(); term(); polish[jj++]='+'; }
      else if(ch=='-'){ readch(); term(); polish[jj++]='-'; }
      else break;
   }
}

void term(){
   factor();
   while(1){
      if(ch=='*'){       readch(); factor(); polish[jj++]='*'; }
      else if(ch=='/'){ readch(); factor(); polish[jj++]='/'; }
      else if(ch=='^'){ readch(); factor(); polish[jj++]='^'; }
      else if(ch=='%'){ readch(); factor(); polish[jj++]='%'; }
      else if(ch=='<'){ readch(); factor(); polish[jj++]='<'; }
      else if(ch=='>'){ readch(); factor(); polish[jj++]='>'; }
      else if(ch=='&'){ readch(); factor(); polish[jj++]='&'; }
      else if(ch=='|'){ readch(); factor(); polish[jj++]='|'; }
      else if(ch=='#'){ readch(); factor(); polish[jj++]='#'; }
      else break;
   }
}

void factor(){
   if(ch=='('){
      while(ch!=')'&&ch!='\0'){
         readch();
         expression();
      }
      if(ch==')') readch();
      else puts("error2");
   }
   else if(isdigit(ch)){
      while(isdigit(ch) && ch!='\0'){
         polish[jj++]=ch;
         readch();
      }
      polish[jj++]='@';
   }
   else puts("error1");
}

2013年5月19日日曜日

逆ポーランドのやつVer.2



下のソースをコンパイルして、そんで実行結果

$ gcc -o calc2 calc2.c -lm
$ ./calc2

追加機能:

calc: 3<2

とすると 3<<2と同じ効果


akira@akira:~/arm1305b$ ./calc2
(q)Button is quit;     calc: (38-3)%13
38@3@-13@%
(38-3)%13=9.000000
(q)Button is quit;     calc: 3<2
3@2@<
3<2=12.000000
(q)Button is quit;     calc: 5>1
5@1@>
5>1=2.000000
(q)Button is quit;     calc: (355/133)
355@133@/
(355/133)=2.669173
(q)Button is quit;     calc: 3*(1+2+3+4)/2
3@1@2@+3@+4@+*2@/
3*(1+2+3+4)/2=15.000000
(q)Button is quit;     calc: q
akira@akira:~/arm1305b$





#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>

/*
逆ポーランド式のパージング

参考資料:

技術評論社 河西 朝雄 著
C言語による はじめてのアルゴリズム入門
2718円+税
P252〜254より引用

技術評論社 奥村晴彦 著
C言語による最新アルゴリズム事典 2330円+税
P72〜73より引用・改変

*/


int ch,ii,jj;
char p[100]="",polish[100];

void readch();
void expression();
void term();
void factor();
double v[50];
int sp1;

main(){
   int i,m,flg;

START:
   ii=0;jj=0;
   printf("(q)Button is quit;     calc: ");
   scanf("%s",p);

   if(p[0]=='q'||p[0]=='Q') exit(1);

  do{
      readch();
      expression();
   } while(ch!='\0');
   p[ii]='\0';
   polish[jj]='\0';

   sp1=0;flg=0;
   for(i=0;i<jj;i++){
      printf("%c",polish[i]);
      if(isdigit(polish[i])){
         if(flg==0){
            flg=1;
            v[++sp1]=polish[i]-'0';
         }
         else v[sp1]=v[sp1]*10+polish[i]-'0';
       
      }
      else if(polish[i]=='@') flg=0;
      else{
         flg=0;
         switch(polish[i]){
            case '+': v[sp1-1]+=v[sp1]; break;
            case '-': v[sp1-1]-=v[sp1]; break;
            case '*': v[sp1-1]*=v[sp1]; break;
            case '/': v[sp1-1]/=v[sp1]; break;
            case '^': v[sp1-1]=pow(v[sp1-1],v[sp1]); break;
            case '%': m=(int)v[sp1-1]%(int)v[sp1];
                       v[sp1-1]=(double)m;
                       break;
            case '<': m=(int)v[sp1-1]<<(int)v[sp1];
                       v[sp1-1]=(double)m;
                       break;
            case '>': m=(int)v[sp1-1]>>(int)v[sp1];
                       v[sp1-1]=(double)m;
                       break;
         }
         sp1--;
      }
   }
   printf("\n%s=%f\n",p,v[1]);
   goto START;
}

void readch(){
     /* if((ch=p[ii++])=='\0') return;*/
   ch=p[ii++];
}

void expression(){
   term();
   while(1){
      if(ch=='+'){      readch(); term(); polish[jj++]='+'; }
      else if(ch=='-'){ readch(); term(); polish[jj++]='-'; }
      else break;
   }
}

void term(){
   factor();
   while(1){
      if(ch=='*'){       readch(); factor(); polish[jj++]='*'; }
      else if(ch=='/'){ readch(); factor(); polish[jj++]='/'; }
      else if(ch=='^'){ readch(); factor(); polish[jj++]='^'; }
      else if(ch=='%'){ readch(); factor(); polish[jj++]='%'; }
      else if(ch=='<'){ readch(); factor(); polish[jj++]='<'; }
      else if(ch=='>'){ readch(); factor(); polish[jj++]='>'; }
      else break;
   }
}

void factor(){
   if(ch=='('){
      while(ch!=')'&&ch!='\0'){
         readch();
         expression();
      }
      if(ch==')') readch();
      else puts("error2");
   }
   else if(isdigit(ch)){
      while(isdigit(ch) && ch!='\0'){
         polish[jj++]=ch;
         readch();
      }
      polish[jj++]='@';
   }
   else puts("error1");
}

逆ポーランド表現のパーサとその演算


こんなもんじゃろ

$ gcc -o calc1 calc1.c -lm
$ ./calc1

止めたい時はqを入力するかCTRL+C


#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>

/*
逆ポーランド式のパージング

参考資料:

技術評論社 河西 朝雄 著
C言語による はじめてのアルゴリズム入門
2718円+税
P252〜254より引用

技術評論社 奥村晴彦 著
C言語による最新アルゴリズム事典 2330円+税
P72〜73より引用・改変

*/


int ch,ii,jj;
char p[100]="",polish[100];

void readch();
void expression();
void term();
void factor();
double v[50];
int sp1;

main(){
   int i,m,flg;

START:
   ii=0;jj=0;
   printf("(q)Button is quit;     calc: ");
   scanf("%s",p);

   if(p[0]=='q'||p[0]=='Q') exit(1);

  do{
      readch();
      expression();
   } while(ch!='\0');
   p[ii]='\0';
   polish[jj]='\0';

   sp1=0;flg=0;
   for(i=0;i<jj;i++){
      printf("%c",polish[i]);
      if(isdigit(polish[i])){
         if(flg==0){
            flg=1;
            v[++sp1]=polish[i]-'0';
         }
         else v[sp1]=v[sp1]*10+polish[i]-'0';
       
      }
      else if(polish[i]=='@') flg=0;
      else{
         flg=0;
         switch(polish[i]){
            case '+': v[sp1-1]+=v[sp1]; break;
            case '-': v[sp1-1]-=v[sp1]; break;
            case '*': v[sp1-1]*=v[sp1]; break;
            case '/': v[sp1-1]/=v[sp1]; break;
            case '^': v[sp1-1]=pow(v[sp1-1],v[sp1]); break;
            case '%': m=(int)v[sp1-1]%(int)v[sp1];
                       v[sp1-1]=(double)m;
                       break;
         }
         sp1--;
      }
   }
   printf("\n%s=%f\n",p,v[1]);
   goto START;
}

void readch(){
      if((ch=p[ii++])=='\0') return;
}

void expression(){
   term();
   while(1){
      if(ch=='+'){      readch(); term(); polish[jj++]='+'; }
      else if(ch=='-'){ readch(); term(); polish[jj++]='-'; }
      else break;
   }
}

void term(){
   factor();
   while(1){
      if(ch=='*'){       readch(); factor(); polish[jj++]='*'; }
      else if(ch=='/'){ readch(); factor(); polish[jj++]='/'; }
      else if(ch=='^'){ readch(); factor(); polish[jj++]='^'; }
      else if(ch=='%'){ readch(); factor(); polish[jj++]='%'; }
      else break;
   }
}

void factor(){
   if(ch=='('){
      while(ch!=')'&&ch!='\0'){
         readch();
         expression();
      }
      if(ch==')') readch();
      else puts("error2");
   }
   else if(isdigit(ch)){
      while(isdigit(ch) && ch!='\0'){
         polish[jj++]=ch;
         readch();
      }
      polish[jj++]='@';
   }
   else puts("error1");
}

2013年5月17日金曜日

前回のリュカ・プログラムの出力結果



akira@akira:~$ cd arm1305b
akira@akira:~/arm1305b$ ./lucas10

Save File: 2.txt
From Anum: 2
To   Bnum: 650


というように実行します





from A=2 to B=650
file: 2.txt
CALC START:
p=2 はM素数 t=0.00 pt=0.03
p=3 はM素数 t=0.00 pt=0.03
p=5 はM素数 t=0.00 pt=0.03
p=7 はM素数 t=0.00 pt=0.03
p=13 はM素数 t=0.00 pt=0.08
p=17 はM素数 t=0.00 pt=0.09
p=19 はM素数 t=0.00 pt=0.09
p=31 はM素数 t=0.00 pt=0.19
p=61 はM素数 t=0.01 pt=0.25
p=89 はM素数 t=0.06 pt=0.46
p=107 はM素数 t=0.09 pt=0.81
p=127 はM素数 t=0.18 pt=1.33
p=521 はM素数 t=4.21 pt=99.89
p=607 はM素数 t=6.46 pt=171.58
CALC END: t=7.80 pt=222.26
from A=650 to B=1000
file: 2.txt
CALC START:
CALC END: t=27.61 pt=841.16
from A=1000 to B=1500
file: 2.txt
CALC START:
p=1279 はM素数 t=57.09 pt=1615.66
CALC END: t=93.30 pt=4064.48
from A=1500 to B=1800
file: 2.txt
CALC START:
CALC END: t=156.76 pt=4879.25
from A=1800 to B=2000
file: 2.txt
CALC START:
CALC END: t=219.22 pt=4853.81

リュカ・レーマー・テスト最終版netwalker(ARM)


#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#define N 10000
#define A 800
#define B 1000
#define TXT "lucas7a.txt"

/*
技術評論社 奥村晴彦 著
C言語による最新アルゴリズム事典 2330円+税
P160〜161より引用・改変

A=始める数字
B=計算をここまでの数字までやる
TXT=実行結果を書き込むファイル名

AからBまでの素数のみリュカ・レーマー・テストをする
メルセンヌ素数は、2,3,5,7,13,17,19,31,61,89,107,127,
521,607,1279,2203,2281,3217,4253,4423,9689,9941,11213,
19937,21701,23209,44497,86243,110503,132049,216091


リュカ・レーマー・テストのアルゴリズムは

M(P)=2^P-1; として、

x(1)=4;
x(i+1)=(x(i)^2-2) mod M(P)
x(P-1)=0 なら素数


*/

int prime(int p);
double gettime();
double st,pt;

main(){
   int p,a=A,b=B,c,m,s,i;
   int d,e,f,g,h;
   double da,db,dc,dd;

   char s1[15]="";
   char s2[ 5]="a";
   char s3[10]="fail\n";
   char s4[25]="from A=%d to B=%d\n";
   char s5[15]="file: %s\n";
   char s6[15]="CALC START:\n";
   char s7[40]="p=%d はM素数 t=%4.2f pt=%4.2f\n";
   char s8[50]="p=%d はM素数でない t=%4.2f pt=%4.2f\n";
   char s9[35]="CALC END: t=%4.2f pt=%4.2f\n";
   char s10[5]="%s";
   char s11[19]="\33[0;0HSave File: ";
   char s12[13]="From Anum: ";
   char s13[13]="To   Bnum: ";
   char s14[5]="%d";
   char s15[10]="\33[2J";
   char s16[10]="\n\n\n";
   char s17[50]="\33[8;0H\33[Kp=%d はM素数 t=%4.2f pt=%4.2f\n";
   char s18[60]="\33[8;0H\33[Kp=%d はM素数でない t=%4.2f pt=%4.2f\n";
   FILE *fp;

   pt=0.0;
   st=0.0;

  /* 上の2行はアドレスがころころ変わるのを防ぐ     */
  /* 今の時点で pt=.L3+68 st=.L3+72 ファイル名はs1に */

   asm("   sub r0,fp,#250");
   asm("   sub r0,r0,#133");
   asm("   bl printf");

   asm("   sub r0,fp,#250");
   asm("   sub r0,r0,#92");
   asm("   bl printf");

   asm("   sub r0,fp,#250");
   asm("   sub r0,r0,#73");
   asm("   sub r1,fp,#123");
   asm("   bl scanf");

   asm("   sub r0,fp,#250");
   asm("   sub r0,r0,#105");
   asm("   bl printf");

   asm("   sub r0,fp,#250");
   asm("   sub r0,r0,#123");
   asm("   sub r1,fp,#104");
   asm("   bl scanf");

   asm("   sub r0,fp,#250");
   asm("   sub r0,r0,#118");
   asm("   bl printf");

   asm("   sub r0,fp,#250");
   asm("   sub r0,r0,#123");
   asm("   sub r1,fp,#100");
   asm("   bl scanf");

   asm("   bl    gettime");
   asm("   ldr   r2, .L3+68");
   asm("   stmia r2, {r0-r1}");

   asm("   sub r0,fp,#123");
   asm("   sub r1,fp,#128");
   asm("   bl  fopen");

   asm("   mov r10,r0");
   asm("   cmp r10,#0");
   asm("   bne T2");
   asm("   sub r0,fp,#138");
   asm("   bl  puts");
   asm("   mov r0,#1");
   asm("   bl  exit");
   asm("T2:");

   asm("   mov r0,r10");
   asm("   sub r1,fp,#163");
   asm("   ldr r2,[fp,#-104]");
   asm("   ldr r3,[fp,#-100]");
   asm("   bl  fprintf");
   asm("   mov r0,r10");
   asm("   sub r1,fp,#178");
   asm("   sub r2,fp,#123");
   asm("   bl  fprintf");
   asm("   mov r0,r10");
   asm("   sub r1,fp,#193");
   asm("   bl  fprintf");

   asm("   mov r0,r10");
   asm("   bl  fclose");

   asm("   ldr r4,[fp,#-104]");
   asm("   ldr r9,[fp,#-100]");
   asm("   b U3");
   asm("U12:");

   asm("   mov r5,r4");
   asm("   mov r6,#2");

   asm("   b U4");
   asm("U8:   ");
   asm("   mov r3,r6");
   asm("   mul r2,r3,r6");
   asm("   cmp r2,r5");
   asm("   bgt U5");

   asm("   mov r0,r5");
   asm("   mov r1,r6");
   asm("   bl __aeabi_idivmod");
   asm("   cmp r1,#0");
   asm("   bne U6");

   asm("   mov r0,r5");
   asm("   mov r1,r6");
   asm("   bl __aeabi_idiv");
   asm("   mov r5,r0");
   asm("   mov r6,#2");
   asm("   b U4");
   asm("U6:   ");

   asm("   cmp r6,#2");
   asm("   bne U7");
   asm("   add r6,r6,#1");
   asm("   b U4");
   asm("U7:   ");
   asm("   add r6,r6,#2");

   asm("U4:");
   asm("   cmp r6,r5");
   asm("   ble U8");
   asm("U5:   ");

   asm("   cmp r5,r4");
   asm("   bne U9");

   asm("   mov r0,r5");
   asm("   bl prime");
   asm("   cmp r0,#0");
   asm("   beq U10");

   asm("   bl  gettime");
   asm("   mov r7,r0");
   asm("   mov r8,r1");

   asm("   ldr r2,.L3+68");
   asm("   ldmia r2,{r2-r3}");
   asm("   bl  __aeabi_dsub");

   asm("   str r0,[sp,#0]");
   asm("   str r1,[sp,#4]");
   asm("   sub r2,fp,#60");
   asm("   stmia r2,{r0-r1}");

   asm("   mov r0,r7");
   asm("   mov r1,r8");
   asm("   ldr r2,.L3+72");
   asm("   ldmia r2,{r2-r3}");

   asm("   bl __aeabi_dsub");
   asm("   sub r2,fp,#52");
   asm("   stmia r2,{r0-r1}");

   asm("   mov r2,r0");
   asm("   mov r3,r1");

   asm("   sub r0,fp,#233");
   asm("   sub r0,r0,#210");
   asm("   mov r1,r4");
   asm("   bl  printf");

   asm("   sub r0,fp,#123");
   asm("   sub r1,fp,#128");
   asm("   bl  fopen");

   asm("   mov r10,r0");
   asm("   cmp r10,#0");
   asm("   bne T3");
   asm("   sub r0,fp,#138");
   asm("   bl  puts");
   asm("   mov r0,#1");
   asm("   bl  exit");
   asm("T3:");

   asm("   mov r0,r10");
   asm("   sub r1,fp,#233");
   asm("   mov r2,r4");
   asm("   sub r7,fp,#52");
   asm("   ldmia r7,{r7-r8}");
   asm("   stmia sp,{r7-r8}");

   asm("   sub r7,fp,#60");
   asm("   ldmia r7,{r7-r8}");
   asm("   str r7,[sp,#8]");
   asm("   str r8,[sp,#12]");
   asm("   bl  fprintf");

   asm("   mov r0,r10");
   asm("   bl  fclose");

   asm("   b U9");
   asm("U10:   ");

   asm("   bl  gettime");
   asm("   mov r7,r0");
   asm("   mov r8,r1");

   asm("   ldr r2,.L3+68");
   asm("   ldmia r2,{r2-r3}");
   asm("   bl  __aeabi_dsub");

   asm("   stmia sp,{r0-r1}");
   asm("   mov r0,r7");
   asm("   mov r1,r8");
   asm("   ldr r2,.L3+72");
   asm("   ldmia r2,{r2-r3}");

   asm("   bl __aeabi_dsub");
   asm("   mov r2,r0");
   asm("   mov r3,r1");

   asm("   sub r0,fp,#250");
   asm("   sub r0,r0,#253");
   asm("   mov r1,r4");
   asm("   bl  printf");

   asm("U9:");
   asm("   add r4,r4,#1");
   asm("U3:");
   asm("   cmp r4,r9");
   asm("   ble U12");

   asm("   sub r0,fp,#123");
   asm("   sub r1,fp,#128");
   asm("   bl  fopen");

   asm("   mov r10,r0");
   asm("   cmp r10,#0");
   asm("   bne T4");
   asm("   sub r0,fp,#138");
   asm("   bl  puts");
   asm("   mov r0,#1");
   asm("   bl  exit");
   asm("T4:");

   asm("   bl  gettime");
   asm("   mov r5,r0");
   asm("   mov r6,r1");

   asm("   ldr r2,.L3+68");
   asm("   ldmia r2,{r2-r3}");
   asm("   bl  __aeabi_dsub");

   asm("   stmia sp,{r0-r1}");
   asm("   mov r0,r5");
   asm("   mov r1,r6");
   asm("   ldr r2,.L3+72");
   asm("   ldmia r2,{r2-r3}");

   asm("   bl __aeabi_dsub");
   asm("   mov r2,r0");
   asm("   mov r3,r1");

   asm("   mov r0,r10");
   asm("   sub r1,fp,#250");
   asm("   sub r1,r1,#68");
   asm("   bl  fprintf");

   asm("   mov r0,r10");
   asm("   bl  fclose");

   asm("   sub r0,fp,#250");
   asm("   sub r0,r0,#143");
   asm("   bl printf");

}

double gettime(){
   struct timeval tv;
   int a,b,c,d,e;
   double da=1e-6,db,dc,dd;

   asm("   push {r2,r3,r4}");
   asm("   push {r5,r6}");
   asm("   sub r0,fp,#80");
   asm("   mov r1,#0");
   asm("   bl gettimeofday");
   asm("   ldr r0,[fp,#-80]");
   asm("   bl __aeabi_i2d");
   asm("   mov r5,r0");
   asm("   mov r6,r1");
   asm("   ldr r0,[fp,#-76]");
   asm("   bl __aeabi_i2d");
   asm("   sub r2,fp,#52");
   asm("   ldmia r2,{r2-r3}");
   asm("   bl __aeabi_dmul");
   asm("   mov r2,r5");
   asm("   mov r3,r6");
   asm("   bl __aeabi_dadd");
   asm("   pop {r5,r6}");
   asm("   pop {r2,r3,r4}");


}

int prime(int p){
   char a[N+1],x[N];
   int h,i,j,k,s;
   int b=N,c=p,d=-10097,e=-20097,f=-20137,g;
   double da,db,dc,dd;

   char s1[40]="\33[6;0H\33[K%d/%d t=%4.2f pt=%4.2f\n";
   char s2[10]="%s";
   char s3[10]="s=%s\n";
   char s4[10]="%d";
   char s5[10]="f=%f\n";

   da=pt;
   db=st;

  /* 上の2行はアドレスがころころ変わるのを防ぐ */
  /* 今の時点で pt=.L11+56 st=.L11+60            */

   asm("   push {r4,r5,r6,r7,r8,r9,r10}");
   asm("   bl    gettime");
   asm("   ldr   r2, .L11+60");
   asm("   stmia r2, {r0-r1}");

   asm("   ldr r4,[fp,#-72]");
   asm("   ldr r2,[fp,#-68]");
   asm("   add r1,fp,r2");
   asm("   mov r3,#0");
   asm("   mov r7,#0");
   asm("   b T22");

   asm("T23:");
   asm("   strb r3,[r1,r7]");
   asm("   add r7,r7,#1");
   asm("T22:");

   asm("   cmp r7,r4");
   asm("   blt T23");

   asm("   mov r3,#1");
   asm("   strb r3,[r1,#2]");

   asm("   mov r9,#2");
   asm("   b T24");
   asm("T34:");

   asm("   and r0,r9,#0x1f");
   asm("   cmp r0,#0");
   asm("   bne S4");

   asm("   bl  gettime");
   asm("   mov r5,r0");
   asm("   mov r6,r1");

   asm("   ldr r2,.L11+56");
   asm("   ldmia r2,{r2-r3}");
   asm("   bl  __aeabi_dsub");

   asm("   str r0,[sp,#4]");
   asm("   str r1,[sp,#8]");
   asm("   mov r0,r5");
   asm("   mov r1,r6");

   asm("   ldr r2,.L11+60");
   asm("   ldmia r2,{r2-r3}");

   asm("   bl __aeabi_dsub");
   asm("   mov r3,r0");
   asm("   str r1,[sp,#0]");

   asm("   ldr r0,[fp,#-60]");
   asm("   add r0,fp,r0");
   asm("   mov r1,r9");
   asm("   mov r2,r4");
   asm("   bl printf");

   asm("S4:");

   asm("   ldr r2,[fp,#-68]");
   asm("   add r1,fp,r2");
   asm("   ldr r2,[fp,#-64]");
   asm("   add r0,fp,r2");
   asm("   mov r3,#1");
   asm("   mov r7,#0");

   asm("   b T25");
   asm("T26:");

   asm("   ldrb r2,[r1,r7]");
   asm("   strb r2,[r0,r7]");
   asm("   strb r3,[r1,r7]");
   asm("   add r7,r7,#1");

   asm("T25:");

   asm("   cmp r7,r4");
   asm("   blt T26");

   asm("   mov r3,#0");
   asm("   strb r3,[r1,#1]");

   asm("   mov r7,#0");
   asm("   b T27");
   asm("T33:");
   asm("   ldr r2,[fp,#-64]");
   asm("   add r0,fp,r2");
   asm("   ldrb r3,[r0,r7]");

   asm("   cmp r3,#0");
   asm("   beq T28");

   asm("   mov r5,#0");
   asm("   mov r6,r7");
   asm("   mov r8,#0");
   asm("   b T29");
   asm("T30:");
   asm("   ldr r2,[fp,#-64]");
   asm("   add r1,fp,r2");
   asm("   ldrb r0,[r1,r8]");
   asm("   ldr r2,[fp,#-68]");
   asm("   add r1,fp,r2");
   asm("   ldrb r2,[r1,r6]");
   asm("   add r0,r0,r2");

   asm("   mov r2,r5,asr #1");
   asm("   add r5,r0,r2");

   asm("   and r3,r5,#1");

/*
   asm("   str r3,[fp,#-92]");
   asm("   push {r0,r1,r2,r3}");
   asm("   ldr r2,[fp,#-60]");
   asm("   add r0,fp,r2");
   asm("   sub r0,r0,#30");
   asm("   ldr r1,[fp,#-92]");
   asm("   bl printf");
   asm("   pop {r0,r1,r2,r3}");
*/


   asm("   strb r3,[r1,r6]");

   asm("   add r0,r6,#1");
   asm("   mov r1,r4");
   asm("   bl __aeabi_idivmod");
   asm("   mov r6,r1");
   asm("   add r8,r8,#1");
   asm("T29:   ");
   asm("   cmp r8,r4");
   asm("   blt T30");
   asm("   cmp r5,#1");
   asm("   ble T28");

   asm("   b   T31");

   asm("T32:");
   asm("   ldr r2,[fp,#-68]");
   asm("   add r1,fp,r2");
   asm("   mov r0,#0");
   asm("   strb r0,[r1,r6]");

   asm("   add r0,r6,#1");
   asm("   mov r1,r4");
   asm("   bl __aeabi_idivmod");
   asm("   mov r6,r1");

   asm("T31:");
   asm("   ldr r2,[fp,#-68]");
   asm("   add r1,fp,r2");
   asm("   ldrb r0,[r1,r6]");
   asm("   cmp r0,#0");
   asm("   bne T32");
   asm("   mov r0,#1");
   asm("   strb r0,[r1,r6]");
   asm("T28:");
   asm("   add r7,r7,#1");
   asm("T27:");
   asm("   cmp r7,r4");
   asm("   blt T33");
   asm("   add r9,r9,#1");
   asm("T24:");
   asm("   cmp r9,r4");
   asm("   blt T34");

   asm("   ldr r2,[fp,#-68]");
   asm("   add r1,fp,r2");
   asm("   ldrb r0,[r1,#0]");
   asm("   rsb r2,r0,#1");
   asm("   strb r2,[r1,r4]");

   asm("   mov r7,#1");
   asm("   b T35");
   asm("T36:");
   asm("   add r7,r7,#1");
   asm("T35:");
   asm("   ldrb r0,[r1,r7]");
   asm("   ldrb r2,[r1,#0]");
   asm("   cmp r0,r2");
   asm("   beq T36");

   asm("   cmp r7,r4");
   asm("   movne r0,#0");
   asm("   moveq r0,#1");

   asm("   pop {r4,r5,r6,r7,r8,r9,r10}");
}