2013年7月25日木曜日

UTF-8の全角を表示するプログラム改良版の出力結果

e598b0:嘰嘱嘲嘳嘴嘵嘶嘷嘸嘹嘺嘻嘼嘽嘾嘿
e59980:噀噁噂噃噄噅噆噇噈噉噊噋噌噍噎噏
e59990:噐噑噒噓噔噕噖噗噘噙噚噛噜噝噞噟
e599a0:噠噡噢噣噤噥噦噧器噩噪噫噬噭噮噯
e599b0:噰噱噲噳噴噵噶噷噸噹噺噻噼噽噾噿
e59a80:嚀嚁嚂嚃嚄嚅嚆嚇嚈嚉嚊嚋嚌嚍嚎嚏
e59a90:嚐嚑嚒嚓嚔嚕嚖嚗嚘嚙嚚嚛嚜嚝嚞嚟
e59aa0:嚠嚡嚢嚣嚤嚥嚦嚧嚨嚩嚪嚫嚬嚭嚮嚯
e59ab0:嚰嚱嚲嚳嚴嚵嚶嚷嚸嚹嚺嚻嚼嚽嚾嚿
e59b80:囀囁囂囃囄囅囆囇囈囉囊囋囌囍囎囏
e59b90:囐囑囒囓囔囕囖囗囘囙囚四囜囝回囟
e59ba0:因囡团団囤囥囦囧囨囩囪囫囬园囮囯
e59bb0:困囱囲図围囵囶囷囸囹固囻囼国图囿
e59c80:圀圁圂圃圄圅圆圇圈圉圊國圌圍圎圏
e59c90:圐圑園圓圔圕圖圗團圙圚圛圜圝圞土
e59ca0:圠圡圢圣圤圥圦圧在圩圪圫圬圭圮圯
e59cb0:地圱圲圳圴圵圶圷圸圹场圻圼圽圾圿
e59d80:址坁坂坃坄坅坆均坈坉坊坋坌坍坎坏
e59d90:坐坑坒坓坔坕坖块坘坙坚坛坜坝坞坟
e59da0:坠坡坢坣坤坥坦坧坨坩坪坫坬坭坮坯
e59db0:坰坱坲坳坴坵坶坷坸坹坺坻坼坽坾坿
e59e80:垀垁垂垃垄垅垆垇垈垉垊型垌垍垎垏
e59e90:垐垑垒垓垔垕垖垗垘垙垚垛垜垝垞垟
e59ea0:垠垡垢垣垤垥垦垧垨垩垪垫垬垭垮垯
e59eb0:垰垱垲垳垴垵垶垷垸垹垺垻垼垽垾垿
e59f80:埀埁埂埃埄埅埆埇埈埉埊埋埌埍城埏

UTF-8の全角を表示するプログラム改良版

/*ひな型Hello*/
#include <stdio.h>

main(){
   int a,b,c;
   FILE *fp;

   fp=fopen("725a.txt","wb");
   if(fp==NULL){
      printf("fail\n");
      return;
   }

   for(a=0xe1;a<=0xec;a++){
      for(b=0x80;b<=0xbf;b++){
         for(c=0x80;c<=0xbf;c++){
           if((c%16)==0){
               printf("%x",a);
               printf("%x",b);
               printf("%x",c);
               printf(":");
               fprintf(fp,"%x",a);
               fprintf(fp,"%x",b);
               fprintf(fp,"%x",c);
               fprintf(fp,":");
           }
            printf("%c",a);
            printf("%c",b);
            printf("%c",c);
            fprintf(fp,"%c",a);
            fprintf(fp,"%c",b);
            fprintf(fp,"%c",c);
            if((c%16)==15){
               printf("\n");
               fprintf(fp,"\n");
            }
         }
     }
  }
   fclose(fp);
}

UTF-8の全角を出力するプログラム

/*ひな型Hello*/
#include <stdio.h>

main(){
   int a,b,c;
   FILE *fp;

   fp=fopen("723a.txt","wb");
   if(fp==NULL){
      printf("fail\n");
      return;
   }

   for(a=0xe1;a<=0xec;a++){
      for(b=0x80;b<=0xbf;b++){
         for(c=0x80;c<=0xbf;c++){
            printf("%c",a);
            printf("%c",b);
            printf("%c",c);
            fprintf(fp,"%c",a);
            fprintf(fp,"%c",b);
            fprintf(fp,"%c",c);
            if((c%16)==15){
               printf("\n");
               fprintf(fp,"\n");
            }
         }
     }
  }
  fclose(fp);
}

2013年7月21日日曜日

イラストロジック解析ソルバーで解いたブレーメンの音楽隊


イラストロジック解析(ソルバー)で解いた絵、イタリアです




lsコマンドの真似事lss.c


lss.c

$ gcc -o lss lss.c

$ ./lss

$ ./lss .c  (エルエスエス空白ポチシー)

$ ./lss dir

$ ./lss lss

などなど


#include <sys/syscall.h>
#include <unistd.h>

#ifdef __linux__
# include <linux/types.h>
/* # include <linux/dirent.h> */
# include <linux/unistd.h>
# include <errno.h>
#else
# include <dirent.h>
#endif

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <string.h>
#include <time.h>
#include <stdlib.h>
#define AMAX 256

struct dirent {
   long d_ino;
   off_t d_off;
   unsigned short d_reclen;
   char d_name[256];
};

struct node {
   long fileno;
   char filename[AMAX];
   char atime[AMAX];
   char rwxx[AMAX];
   off_t asize;
   struct node *back,*next;
};

char atime[AMAX];
char filename[AMAX];
char rwxx[AMAX];
off_t asize,sumsize1=0,sumsize2=0;
void timecpy(char a[AMAX],char b[AMAX]);
void rwx(char a[AMAX],long b);
long ic=0,sumcnt1=0,sumcnt2=0;

struct node *node_create();
struct node *shojun(struct node *temp);
struct node *sttc1,*stt;
struct node *startc1,*endc1;
struct node *info,*start,*last,*gcdata,*gc2;


struct stat buf2;
char *search(char *text,char *key);
int kensaku(char *ss);

long cnt=0;
char tt[100];
int j;
int ynflg;
int overflg=0;
int argc1;
char *argv1,p[AMAX];

int main(int argc,char *argv[]){
   int i,im,d_size;
   int fd;
   char buf[4096],ch;
   char ss[500],*p;
   char yn[20];

   argc1=argc;
   argv1=argv[1];
   strcpy(ss,".");
   j=1;
   kensaku(ss);

}

int kensaku(char *ss){
   int i,im,d_size,k;
   int fd;
   char buf[4096],ss1[100][500];
   char *p;

   j++;
   if((fd=open(ss,O_RDONLY))<0){
      perror("open");
      j--;
      return 1;
   }

   while((d_size=syscall(SYS_getdents,fd,(struct dirent *)&buf,sizeof buf))>0){
      for(i=0;i<d_size;i+=((struct dirent *)&buf[i])->d_reclen){
         strcpy(ss1[j],ss);
         strcat(ss1[j],"/");
         strcat(ss1[j],((struct dirent *)&buf[i])->d_name);
         if(stat(ss1[j],&buf2)<0){
              perror("stat");
              j--;
              return 1;
         }

if(ic==0){
startc1=sttc1=gcdata=gc2=node_create();
                ic++;
strcpy(gcdata->filename,((struct dirent *)&buf[i])->d_name);
                timecpy(gcdata->atime,ctime(&buf2.st_mtime));
                rwx(gcdata->rwxx,buf2.st_mode);
                gcdata->asize=buf2.st_size;
         }
         else{
       gcdata->next=node_create();
          gcdata=gcdata->next;
gcdata->back=gc2;
gc2=gc2->next;
strcpy(gcdata->filename,((struct dirent *)&buf[i])->d_name);
                timecpy(gcdata->atime,ctime(&buf2.st_mtime));
                rwx(gcdata->rwxx,buf2.st_mode);
                gcdata->asize=buf2.st_size;
         }
      }
   }

   info=startc1;
   last=NULL;
   while(info){
      startc1     =info->next;
      info->next=NULL;
      stt       =shojun(info);
      info      =startc1;
   }
   startc1=stt;
   endc1=last;

   ic=1;
   info=startc1;
   while(info){
      info->fileno=ic;
      info=info->next;
      ic++;
   }

   if(argc1==1){
      info=startc1;
      while(info){
         sumcnt1++;
         sumsize1+=info->asize;
         printf("%5ld: %-10s %s %s %8ld\33[0m\n",info->fileno,info->filename,info->rwxx,info->atime,info->asize);
         info=info->next;
      }
      printf("\nこのフォルダの総数は %ld でファイルの総和は %ld\n",sumcnt1,sumsize1);
   }
   if(argc1==2){
      info=startc1;
      while(info){
         sumcnt1++;
         sumsize1+=info->asize;
         p=search(info->filename,argv1);
         if(!strcmp(argv1,"dir")&&info->rwxx[0]=='d'){
            sumcnt2++;
            sumsize2+=info->asize;
            printf("%5ld: %-10s %s %s %8ld\33[0m\n",info->fileno,info->filename,info->rwxx,info->atime,info->asize);
         }
         else if(!strcmp(argv1,"file")&&info->rwxx[1]=='f'){
            sumcnt2++;
            sumsize2+=info->asize;
            printf("%5ld: %-10s %s %s %8ld\33[0m\n",info->fileno,info->filename,info->rwxx,info->atime,info->asize);
         }
          else if(p){
            sumcnt2++;
            sumsize2+=info->asize;
            printf("%5ld: %-10s %s %s %8ld\33[0m\n",info->fileno,info->filename,info->rwxx,info->atime,info->asize);
         }
        info=info->next;
      }
      printf("\nカレントディレクトリの総数は %ld でファイルの総和は %ld\n",sumcnt1,sumsize1);
      printf("検索ワードは %s\n検索ワードの総数は %ld でファイルの総和は %ld\n",argv1,sumcnt2,sumsize2);
   }
   if(d_size<0){
      perror("getdents");
      j--;
      return 0;
   }
}



char *search(char *text,char *key){

   int m,n;
   char *p;

   m=strlen(text);
   n=strlen(key);
   for(p=text;p<=text+m-n;p++){
      if(strncmp(p,key,n)==0) return p;
   }
   return NULL;
}

void timecpy(char a[AMAX],char b[AMAX]){

   a[ 0]='\33';
   a[ 1]='[';
   a[ 2]='3';
   a[ 3]='1'+b[23]%5;
   a[ 4]='m';
   a[ 5]=b[20];
   a[ 6]=b[21];
   a[ 7]=b[22];
   a[ 8]=b[23];
   a[ 9]='/';
   a[10]='\33';
   a[11]='[';
   a[12]='3';
   if(b[4]=='J'&&b[5]=='a') a[13]='1';
   else if(b[4]=='F'&&b[5]=='e') a[13]='2';
   else if(b[4]=='M'&&b[6]=='r') a[13]='3';
   else if(b[4]=='A'&&b[5]=='p') a[13]='4';
   else if(b[4]=='M'&&b[6]=='y') a[13]='5';
   else if(b[4]=='J'&&b[5]=='u'&&b[6]=='n') a[13]='6';
   else if(b[4]=='J'&&b[5]=='u'&&b[6]=='l') a[13]='1';
   else if(b[4]=='A'&&b[5]=='u') a[13]='2';
   else if(b[4]=='S'&&b[5]=='e') a[13]='3';
   else if(b[4]=='O'&&b[5]=='c') a[13]='4';
   else if(b[4]=='N'&&b[5]=='o') a[13]='5';
   else if(b[4]=='D'&&b[5]=='e') a[13]='6';
   else a[13]='1';
   a[14]='m';
   a[15]=b[4];
   a[16]=b[5];
   a[17]=b[6];
   a[18]='/';
   a[19]='\33';
   a[20]='[';
   a[21]='3';
   a[22]='1'+b[9]%5;
   a[23]='m';
   if(b[8]==' ') a[24]='0';
   else          a[24]=b[8];
   a[25]=b[9];
   a[26]='\33';
   a[27]='[';
   a[28]='3';
   if(b[0]=='S'&&b[1]=='u') a[29]='1';
   else if(b[0]=='S'&&b[1]=='a') a[29]='2';
   else if(b[0]=='M') a[29]='2';
   else if(b[0]=='T'&&b[1]=='u') a[29]='3';
   else if(b[0]=='T'&&b[1]=='h') a[29]='6';
   else if(b[0]=='W') a[29]='4';
   else if(b[0]=='F') a[29]='5';
   else a[29]='1';
   a[30]='m';
   a[31]='(';
   a[32]=b[0];
   a[33]=b[1];
   a[34]=b[2];
   a[35]=')';
   a[36]='\33';
   a[37]='[';
   a[38]='3';
   a[39]='1'+b[12]%5;
   a[40]='m';
   a[41]=b[11];
   a[42]=b[12];
   a[43]=b[13];
   a[44]='\33';
   a[45]='[';
   a[46]='3';
   a[47]='1'+b[15]%5;
   a[48]='m';
   a[49]=b[14];
   a[50]=b[15];
   a[51]=b[16];
   a[52]='\33';
   a[53]='[';
   a[54]='3';
   a[55]='1'+b[18]%5;
   a[56]='m';
   a[57]=b[17];
   a[58]=b[18];
   a[59]='\0';
   if(b[0]==' ') strcpy(a,"  \33[31mファイルがありません  ");

}

struct node *node_create()
{
   struct node *from;
   int size;

   size=sizeof(struct node);

   from = (struct node*)malloc(size);
   if(!from){
      printf("out of memory ¥n");
      exit(0);
   }
   from->next=NULL;
   from->back=NULL;
   from->fileno=0;
   strcpy(from->filename,"");
   strcpy(from->atime,"");
   from->asize=0;
   return from;
}


struct node *shojun(struct node *temp)
{
   struct node *old;
   struct node *now;

   now=stt;
   old=NULL;

   if(!last){
      temp->next=NULL;
      temp->back=NULL;
      last      =temp;
      return temp;
   }
   while(now){
      if(strcmp(now->filename,temp->filename) < 0){
         old=now;
         now=now->next;
      }
      else{
         if(old){
            old ->next=temp;
   now->back=temp;
            temp->next=now;
   temp->back=old;
            return stt;
         }
         else{
            temp->next=now;
   now->back=temp;
   temp->back=NULL;
            return temp;
         }
      }
   }
   last->next=temp;
   temp->back=last;
   temp->next=NULL;
   last      =temp;
   return stt;
}

void rwx(char a[AMAX],long b){
   strcpy(a,"_________________");
   if((b&0x8000)==0x8000) a[1]='f';
   if((b&0x4000)==0x4000) a[0]='d';
/*
   if((b&0x2000)==0x2000) a[2]='c';
   if((b&0x1000)==0x1000) a[3]='d';
   if((b&0x0800)==0x0800) a[4]='e';
   if((b&0x0400)==0x0400) a[5]='f';
   if((b&0x0200)==0x0200) a[6]='g';
*/
   if((b&0x0100)==0x0100) a[3]='r';
   if((b&0x0080)==0x0080) a[4]='w';
   if((b&0x0040)==0x0040) a[5]='x';
   if((b&0x0020)==0x0020) a[6]='r';
   if((b&0x0010)==0x0010) a[7]='w';
   if((b&0x0008)==0x0008) a[8]='x';
   if((b&0x0004)==0x0004) a[9]='r';
   if((b&0x0002)==0x0002) a[10]='w';
   if((b&0x0001)==0x0001) a[11]='x';
   a[12]=0;
}

2013年7月18日木曜日

英大文字を小文字に、小文字を大文字にするアセンブラ(dynabook AZ)


/*ひな型Hello*/
#include <stdio.h>

main(){
   char s[100]="                                                  ";
   char s1[20]="%s";
   char s2[20]="%s\n";
   char s3[20]=" input: ";
   char s4[20]="output: %s\n";
   int i;
/*
s[0]=0;
s1[0]=0;
s2[0]=0;
s3[0]=0;
s4[0]=0;
*/

   asm("   add r0,r7,#0");
   asm("   add r1,r7,#40");
   asm("   bl printf");

   asm("   add r0,r7,#0");
   asm("   add r1,r7,#80");
   asm("   bl __isoc99_scanf");
   asm("   mov r5,#0");

   asm("   b T2");
   asm("T5:   ");
   asm("   add r2,r7,#80");
   asm("   ldrb r4,[r2,r5]");
   asm("   cmp r4,#64");
   asm("   bls T3");
   asm("   cmp r4,#90");
   asm("   bhi T3");
   asm("   adds r4,r4,#32");
   asm("   strb r4,[r2,r5]");
   asm("   b T4");

   asm("T3:   ");
   asm("   cmp r4,#96");
   asm("   bls T4");
   asm("   cmp r4,#122");
   asm("   bhi T4");
   asm("   subs r4,r4,#32");
   asm("   strb r4,[r2,r5]");

   asm("T4:   ");
   asm("   adds r5,r5,#1");

   asm("T2:   ");
   asm("   add r2,r7,#80");
   asm("   ldrb r4,[r2,r5]");
   asm("   cmp r4,#0");
   asm("   bne T5");
   asm("   add r0,r7,#60");
   asm("   add r1,r7,#80");
   asm("   bl printf");

}

英大文字を小文字に、小文字を大文字にするプログラム


/*ひな型Hello*/
#include <stdio.h>

main(){
   char s[100]="                                                  ";
   char s1[20]="%s";
   char s2[20]="%s\n";
   char s3[20]=" input: ";
   char s4[20]="output: %s\n";
   int i;

   printf(s1,s3);
   scanf(s1,s);

   i=0;
   while(s[i]!='\0'){
      if(0x41<=s[i]&&s[i]<=0x5a) s[i]+=32;
      else if(0x61<=s[i]&&s[i]<=0x7a) s[i]-=32;
      i++;
   }
   printf(s4,s);
}

2013年7月9日火曜日

where grep プログラム



grepみたいなものを自分で作ったよん

netwalkerでは何故か動かなかったけど
dynabookAZでは動いた

実行例:

/usr/include内でatoiという関数がどのファイルに
あるか調べる

結果はstdlib.h

プログラム名は、whg(whg.c)

akira@akira-laptop:~/ii1302$ whg
検索する場所:/usr/include
ss=/usr/include
サブディレクトリも検索する[y/n]:n
サブディレクトリは検索しない
検索する言葉:atoi
tt=atoi

0001: 147行 extern int atoi (const char *__nptr)     [/usr/include/stdlib.h]
0002: 278行 __NTH (atoi (const char *__nptr))     [/usr/include/stdlib.h]
akira@akira-laptop:~/ii1302$






akira@akira-laptop:~$ cat whg.c


#include <sys/syscall.h>
#include <unistd.h>

#ifdef __linux__
# include <linux/types.h>
/* # include <linux/dirent.h> */
# include <linux/unistd.h>
# include <errno.h>
#else
# include <dirent.h>
#endif

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <string.h>

struct dirent {
   long d_ino;
   off_t d_off;
   unsigned short d_reclen;
   char d_name[256];
};

struct stat buf2;
char *search(char *text,char *key);
int kensaku(char *ss);

long cnt=0;
char tt[100];
int j;
int ynflg;
int overflg=0;

int main(){
   int i,im,d_size;
   int fd;
   char buf[4096],ch;
   char ss[500],*p;
   char yn[20];

   printf("検索する場所:");

   ch=0; im=0;
   while(ch!='\n'){
      ch=getchar();
      if(ch!='\n'){
         ss[im]=ch;
         im++;
      }
   }
   ss[im]='\0';
   if(strcmp(ss,"")==0) strcpy(ss,".");
   printf("ss=%s\n",ss);

   printf("サブディレクトリも検索する[y/n]:");
   ch=0; im=0;
   while(ch!='\n'){
      ch=getchar();
      if(ch!='\n'){
         yn[im]=ch;
         im++;
      }
   }
   yn[im]='\0';
   if(yn[0]=='n'||yn[0]=='N') ynflg=0;
   else ynflg=1;
 
   if(ynflg==1) printf("サブディレクトリも検索\n");
   if(ynflg==0) printf("サブディレクトリは検索しない\n");

   printf("検索する言葉:");

   ch=0; im=0;
   while(ch!='\n'){
      ch=getchar();
      if(ch!='\n'){
         tt[im]=ch;
         im++;
      }
   }
   tt[im]='\0';
   printf("tt=%s\n",tt);
   printf("\n");

   j=1;
   kensaku(ss);

}

int kensaku(char *ss){
   long gyo;
   int i,im,d_size,k,pos;
   int fd;
   char buf[4096],ss1[100][500];
   char *p,text[4096],q;
   FILE *fp;

   j++;
   /*printf("j=%d ss=%s\n",j,ss);*/
   if(cnt>=100){ goto OVER200; }

   if((fd=open(ss,O_RDONLY))<0){
      perror("open");
      j--;
      return 1;
   }

   while((d_size=syscall(SYS_getdents,fd,(struct dirent *)&buf,sizeof buf))>0){
      for(i=0;i<d_size;i+=((struct dirent *)&buf[i])->d_reclen){
         strcpy(ss1[j],ss);
         strcat(ss1[j],"/");
         strcat(ss1[j],((struct dirent *)&buf[i])->d_name);
         if(stat(ss1[j],&buf2)<0){
              perror("stat");
              j--;
              return 1;
         }
         if((buf2.st_mode&0xf000)==0x4000&&
             ss1[j][strlen(ss1[j])-1]!='.'&&

             /* 検索対象外を予め作っておく */

             strcmp(ss1[j],"./processing")!=0&&
             strcmp(ss1[j],"./src/mozc/src")!=0&&
             strcmp(ss1[j],"./depot_tools")!=0&&
             strcmp(ss1[j],"./mozc-tmp/mozc-ut-1.1.773.102")!=0&&
             strcmp(ss1[j],"./mozc-tmp/mozcdic-ut-20110803")!=0&&
             strcmp(ss1[j],"./ダウンロード/mozc_test1")!=0&&
             strcmp(ss1[j],"./.mozilla/firefox")!=0&&
             strcmp(ss1[j],"./.gconf/apps")!=0&&
             strcmp(ss1[j],"./.libreoffice")!=0&&
             strcmp(ss1[j],"./gtk")!=0&&
             strcmp(ss1[j],"./.cache")!=0&&
             strcmp(ss1[j],"./.local")!=0&&
             strcmp(ss1[j],"./.config")!=0&&
             strcmp(ss1[j],"./kde")!=0){

             /* 検索対象外を予め作っておく、ここまで */

             k=0;
             if(ynflg==1) k=kensaku(ss1[j]);
             if(k==1){ j--; return 1;}
         }

         fp=fopen(ss1[j],"r");
         if(fp!=NULL){
            gyo=1;
            while( (q=getc(fp)) != 0xff){
               if(q=='\n'){
                  text[pos]='\0';
                  p=search(text,tt);
                  if(p!=NULL&&cnt<100){
                      cnt++;
                      printf("%04ld: %ld行 %s     [%s]\n",cnt,gyo,text,ss1[j]);
                  }
                  pos=0;
                  gyo++;
               }
               else{
                  if(pos>=4096) break;
                  if(q!='\r') text[pos++]=q;
               }
            }
            text[pos]='\0';
         }
         else return 2;

         fclose(fp);


      }
      if(cnt>=100){
          if(overflg==0) printf("検索数が100を超えるので中止します\n");
          overflg=1;
          goto OVER100; }
   }
OVER100:
   if(d_size<0){
      perror("getdents");
      j--;
      return 1;
   }
OVER200:
   j--;
   return 0;
}


char *search(char *text,char *key){

   int m,n;
   char *p;

   m=strlen(text);
   n=strlen(key);
   for(p=text;p<=text+m-n;p++){
      if(strncmp(p,key,n)==0) return p;
   }
   return NULL;
}


akira@akira-laptop:~$

2013年7月7日日曜日

修正アルファベット表示プログラム


一番最後の#4と#24逆にしたらよかったのね


#include <stdio.h>

main(){
   char s[100]="                                                        ";
   char s1[20]="%s\n";

   asm("   mov r3,#65");
   asm("   mov r4,#26");
   asm("   mov r5,#50");
   asm("T1:");
   asm("   sub r6,r5,r4");
   asm("   strb r3,[r7,r6]");
   asm("   add r3,r3,#1");
   asm("   subs r4,r4,#1");
   asm("   bne T1");

   asm("   mov r3,#97");
   asm("   mov r4,#26");
   asm("   mov r5,#79");
   asm("T2:");
   asm("   sub r6,r5,r4");
   asm("   strb r3,[r7,r6]");
   asm("   add r3,r3,#1");
   asm("   subs r4,r4,#1");
   asm("   bne T2");


   asm("   adds r0,r7,#4");
   asm("   adds r1,r7,#24");
   asm("   bl printf");
}




gcc -S 130707D.c -lm
gcc -o 130707D 130707D.c -lm
./130707D
ABCDEFGHIJKLMNOPQRSTUVWXYZ   abcdefghijklmnopqrstuvwxyz 
何かキーを押してください

アルファベット表示プログラム

dynabook AZ de assembler sample:


不完全です。最後の方の#10には触れないでください



#include <stdio.h>

main(){
   char s[100]="                                                        ";
   char s1[20]="%s\n";

   asm("   mov r3,#65");
   asm("   mov r4,#26");
   asm("   mov r5,#50");
   asm("T1:");
   asm("   sub r6,r5,r4");
   asm("   strb r3,[r7,r6]");
   asm("   add r3,r3,#1");
   asm("   subs r4,r4,#1");
   asm("   bne T1");

   asm("   mov r3,#97");
   asm("   mov r4,#26");
   asm("   mov r5,#79");
   asm("T2:");
   asm("   sub r6,r5,r4");
   asm("   strb r3,[r7,r6]");
   asm("   add r3,r3,#1");
   asm("   subs r4,r4,#1");
   asm("   bne T2");

   asm("   mov r3,#10");
   asm("   strb r3,[r7,#79]");

   asm("   adds r0,r7,#24");
   asm("   adds r1,r7,#4");
   asm("   bl printf");
}


実行結果

gcc -S 130707C.c -lm
gcc -o 130707C 130707C.c -lm
./130707C
ABCDEFGHIJKLMNOPQRSTUVWXYZ   abcdefghijklmnopqrstuvwxyz
何かキーを押してください


dynabookAZを手に入れてアセンブラ再開するのだ


ダイナブックAZでアセンブラします


#include <stdio.h>

main(){
   char s[20]="aaaaa";
   char s1[20]="%s\n";
   s[2]='E';
   printf(s1,s);
}


これをインラインアセンブラにすると

#include <stdio.h>

main(){
   char s[20]="aaaaa";
   char s1[20]="%s\n";
   asm("   movs r3,#69");
   asm("   strb r3,[r7,#7]");
   asm("   add r0,r7,#24");
   asm("   adds r1,r7,#4");
   asm("   bl printf");
}


strb r3,[r7,#7]の#7を5とか6とかにいじってコンパイルしてみてね