投稿

ラベル(C)が付いた投稿を表示しています

N88-BASIC、アセンブラ、Cでポインター (6回目)

イメージ
2023/1/31(火) N88-BASIC、アセンブラ、Cでポインター (6回目)   C言語にポインターが存在する意味が   文字列中のアルファベットの小文字を 大文字に変換するプログラムを作ることで   何となく分かるようにするシリーズです     今回はアセンブラ(8086系)の プログラムの紹介です   前回のポインターを使用したCからの変換です   プログラムと解説はコメント(/* … */)を見て下さい   blg~.zip中のptr006asm.cです   #include   <stdio.h>       /* printf等使用の為 */ void  main( void )        /* mainから実行     */ {   c har * p;         /* p = a (aは&a[0]) */    char   a[256];       /* 255文字+終端'\0' */     printf( "? " );   gets_s(a, 256);      /* 文字列入力      */   printf( "%s\n" , a);    /* 文字列表示       */     p = a;        /* mov ebx,aがerrorの為 */    __asm           /* 次の{}内がアセンブラ */   {     mov ebx,p;   ; ebxレジスタ(32bit) = p   L1:     mov al,[ebx]  ; alレジスタ(8bit) = *ebx     test al,al   ; al & al (0のチェック)     je L3      ; if  (al == 0 ) goto  L3     cmp al, 'a'     ; if  (al < 'a' ) goto  L2     jl L2     cmp al, 'z'     ; if  (al > 'z' ) goto  L2     jg L2     sub al, 'a' - 'A'   ;

N88-BASIC、アセンブラ、Cでポインター (5回目)

イメージ
2023/1/25(水) N88-BASIC、アセンブラ、Cでポインター (5回目)   C言語にポインターが存在する意味が   文字列中のアルファベットの小文字を 大文字に変換するプログラムを作ることで   何となく分かるようにするシリーズです     今回はC(言語)で ポインターを使ったプログラムの紹介です プログラムと解説はコメント(/* … */)を見て下さい BASICのアドレス(POKE,PEEK,VARPTRなど) を使ったプログラムや アセンブラを理解していれば より簡単に理解できると思います blg~.zip中のptr005.cです   #include   <stdio.h>       /* printf等使用の為 */ void  main( void )        /* mainから実行     */ {   c har * p;         /* p = a (aは&a[0]) */    char   a[256];       /* 255文字+終端'\0' */     printf( "? " );   gets_s(a, 256);      /* 文字列入力      */   printf( "%s\n" , a);    /* 文字列表示       */    for  (p = a; *p; p++)   /* *p != '\0'繰返し */   {      if  ( 'a'  <= *p && *p <= 'z' )     {       *p -= 'a'  - 'A' ;     }   }   printf( "%s\n" , a);    /* 文字列表示        */    gets_s(a, 256);      /* キー入力待ち     */ }   gets_s(a, 256); がエラーとなる場合は(多少動作は異なりますが) scanf_s("%s", a, 256); を使用して下さい   ポインターの説明 c har * p; のpがポインター(アド

N88-BASIC、アセンブラ、Cでポインター (4回目)

イメージ
2023/1/21(土) N88-BASIC、アセンブラ、Cでポインター (4回目)   C言語にポインターが存在する意味が   文字列中のアルファベットの小文字を 大文字に変換するプログラムを作ることで   何となく分かるようにするシリーズです     今回はC(言語)で 普通に作ったプログラムの紹介です プログラムと解説はコメント(/* … */)を見て下さい   blg~.zip中のptr004.cです   #include   <stdio.h>       /* printf等使用の為 */ void  main( void )        /* mainから実行     */ {    char  a[256];       /* 255文字+終端'\0' */    int   i;          /* 変数の定義       */     printf( "? " );   gets_s(a, 256);      /* 文字列入力      */   printf( "%s\n" , a);    /* 文字列表示       */    for  (i = 0; a[i]; i++)  /* a[i]!='\0'繰返し */   {      if  ( 'a'  <= a[i] && a[i] <= 'z' )     {      a[i] -= 'a'  - 'A' ;     }   }   printf( "%s\n" , a);    /* 文字列表示        */   gets_s(a, 256);      /* キー入力待ち     */ }   gets_s(a, 256); aに入力した文字列を最大256文字まで入れる Cの文字列は文字の配列変数に入れます 最後は'\0'が入りますので上記256文字は 255文字までの文字列という意味です これがエラーとなる場合は(多少動作は異なりますが) scanf_s("%s", a, 256); を使用して下さい   printf( "

N88-BASIC、アセンブラ、Cでポインター (3回目)

イメージ
2023/1/17(火) N88-BASIC、アセンブラ、Cでポインター (3回目)   C言語にポインターが存在する意味が   文字列中のアルファベットの小文字を 大文字に変換するプログラムを作ることで   何となく分かるようにするシリーズです     今回は N88-BASIC,Z80(XL-BASIC)で アセンブラ (Z80)を使用したプログラムの紹介です USR関数とCALLの2種類とも書いています   アセンブり言語をアセンブラで数値に変換したものが マシン語 (機械語)です 使い方が間違っているかもしれませんが ここではアセンブり言語をアセンブラと書いています   NL-BASIC,VL-BASICはアセンブラに対応していないので XL-BASIC(N88-BASIC(PC-8801)+Z80)のみで動きます   blg~.zip中のptr003.basです   150 CLEAR ,&HAFFF    BASIC使用領域は&HAFFFまで(マシン語は&HB000~) 160 ADDR = &HB000 170 GOSUB *ASSEMBLY   マシン語を ADDR番地から読込む 180 DEF USR0 = ADDR '--- USR0 190 STR0 = ADDR + 1 '--- CALL   マシン語呼び出しアドレスの設定 (USR0,CALL)   260 B$ = USR0(A$) 330 CALL ALPH(A$) それぞれの方法でマシン語を呼出しています A$自身が書変わります 書換えた後の A$の値がB$に入ります (文字列以外のB = USR0(A)などはAは変化しません)   以下、アセンブラの解説です   B$ = USR0(A$)では、DE = VARPTR(A$) CALL STR0(A$)では、HL = VARPTR(A$) の様に、 A$の情報が異なるレジスタに入りますので DEの時はDE,HLを入替えて(EX DE,HL) どちらも HL = VARPTR(A$)の状態で書いています   B000: EX DE,HL     ;*U0:SWAP HL,DE    USR0の時のみ   B001: LD B,(HL)    ;*C0:B = PEEK(HL) B002:

N88-BASIC、アセンブラ、Cでポインター (2回目)

イメージ
2023/1/14(土) N88-BASIC、アセンブラ、Cでポインター (2回目)   C言語にポインターが存在する意味が   文字列中のアルファベットの小文字を 大文字に変換するプログラムを作ることで   何となく分かるようにするシリーズです     今回はN88-BASIC(VL,XL,NL-BASIC)で アドレスを使用したプログラムの紹介です アセンブラでプログラムする足ががりです   PC-88(XL-BASIC),PC-98(NL-BASIC),VL-BASIC でメモリー内容が異なりますので その3パターンに対応しています   blg~.zip中のptr002.basです   200 ON N88 + 1 GOSUB *XL, *NL, *VL 240 FOR I=1 TO N 250   B = PEEK(P) 260   IF ASC("a") <= B AND B <= ASC("z") THEN POKE P, B - C 270   P = P + 1 280 NEXT   プログラムと解説を交互に書きました   200 ON N88 + 1 GOSUB *XL, *NL, *VL   各機種ごとに違う読み方で文字数N,アドレスPを設定 240 FOR I=1 TO N 250   B = PEEK(P)    アドレスPの内容をBに入れる 260   IF ASC("a") <= B AND B <= ASC("z") THEN POKE P, B - C    Bが"a"~"z"なら、アドレスP内にB-C("A"~"Z")を入れる 270   P = P + 1    Pを1増やす 280 NEXT   文字数N分繰返す   PEEK(P)はアドレスPのメモリーを読む POKE P,DはアドレスPのメモリーにDを書く という命令です(Dは0~&HFF) このアドレスを入れる変数Pを C言語ではポインターと呼んでいます 以下 メモリーのアドレス(16進数) (BASICでは16進数は&Hを付けて表す) とその内容を アドレス:内容 0000:

N88-BASIC、アセンブラ、Cでポインター (1回目)

イメージ
2023/1/11(水) N88-BASIC、アセンブラ、Cでポインター (1回目)   C言語にポインターが存在する意味が   文字列中のアルファベットの小文字を 大文字に変換するプログラムを作ることで   何となく分かるようにするシリーズです     今回はN88-BASIC(VL,XL,NL-BASIC)で 普通に作ったプログラムの紹介です   BASICとアセンブラ(Z80)をスルーする方は 4回目(C言語)から見て下さい   blg~.zip中のptr001.basの150行目からです   150 INPUT A$ 160 N = LEN(A$) 170 PRINT A$ 180 C = ASC("a") - ASC("A") 190 FOR I=1 TO N 200   B$ = MID$(A$, I, 1) 210   IF "a" <= B$ AND B$ <= "z" THEN MID$(A$, I) = CHR$(ASC(B$) - C) 220 NEXT 230 PRINT A$   プログラムと解説を交互に書きました   150 INPUT A$   キーボードから入力した文字列を文字変数A$に入れる 160 N = LEN(A$)   NにA$の文字数を入れる 170 PRINT A$   A$の文字列を表示する 180 C = ASC("a") - ASC("A")   文字a,Aのキャラクターコードの差をCに入れる 190 FOR I=1 TO N   IがNを超えていればNEXTの次に移動(Iは1~) 200   B$ = MID$(A$, I, 1)   B$に「A$の1から数えてI番目の文字1文字」を入れる 210   IF "a" <= B$ AND B$ <= "z" THEN MID$(A$, I) = CHR$(ASC(B$) - C)   B$が"a"~"z"なら"A"~"Z"に替えてA$のI番目に入れる 220 NEXT   Iを1増やしてFORに戻る 230

N88-BASIC、Cで初心者向けプログラミング (5回目)

イメージ
2023/1/3(火) N88-BASIC、Cで初心者向けプログラミング (5回目)   温度の単位変換 [2 021/4/16(金)~4/18(日) の記事です]   N88-BASIC(VL,NL,XL-BASIC)とC言語で 温度゚CをK,゚Fに変換する簡単な プログラムを作ります   セルシウス度(摂氏)をC(゚C) ケルビン(絶対温度)をK( K) = C + 273.15 ファーレンハイト度 (華氏)をF(゚F) = (9/5)C + 32   行番号 命令(Enterキー) でプログラムが記憶されます 以下、(Enterキー)の記述を省略しますが 1行毎に入力して下さい   RUN  で、行番号の小さい順に実行されます LIST  で、プログラムが表示されます SAVE "ファイル名"  で、プログラムをファイル名.basファイルに保存できます LOAD "ファイル名"  で、プログラムを読込みます   行番号は後から間に入れられるように 10,20,30...または100,110,120... の様に10ずつ増やすと良いでしょう   10 INPUT C  で、? が表示され入力状態にできます 10 INPUT ,C  で、? を消すことが出来ます 10 INPUT "摂氏(゚C) = "; C  で文字表示も出来ます (;の代わりに,を使うと? が消えます)   四則演算(×÷+-)は、* / + - を使います   左辺 = 右辺 は、等しい事の定義ではなく 右辺の計算結果を左辺の変数に代入する と言う意味になります   K = C + 273.15 F = (9/5)C + 32 = C×9÷5+32 はBASICでは   20 K = C + 273.15 30 F = C * 9 / 5 + 32  (スペースは見やすくするためでなくても可)   40 PRINT C;  でCの値を表示できます  (;がないと改行されます) 40 PRINT C; "゚C"  でCの値と文字列゚Cを表示できます  (;と"の間のスペースは無くても同じです)   今回は  0 ゚C = 273.15 K = 32 ゚F と表示するため 40 PRINT C; "

N88-BASIC、Cで初心者向けプログラミング (4回目)

イメージ
2022/2/6(日) N88-BASIC、Cで初心者向けプログラミング (4回目)   配列と文字列   BASICの配列 DIM A(10)で A(0)~A(10)の変数が作られます I = 5ならA(I)はA(5)になります DIMを省略してA(0)などを使用すると DIM A(10)とした時と同じになります DIM B(2, 1)は B(0, 0) B(1, 0) B(2, 0) B(0, 1) B(1, 1) B(2, 1) が作られます   BASICの文字列 "で囲まれた文字の列を文字列といい、 最後に$を付ければ文字変数になります A $ = "abc" B$ = A$ + "efg" PRINT B$ でabcdefと表示されます 文字列の長さは0~255文字までです   C言語の配列 int a[10];で a[0]~a[9]の変数が作られます i = 5ならa[i]はa[5]になります int b[3][2]は b[0][0] b[0][1] b[1][0] b[1][1] b[2][0] b[2][1] が作られます   C言語の文字列 char b;でbは文字変数になります b = 'a';文字は'で囲みます char a[10];で9文字の文字列に なります char d[] = "abc"; は、宣言時のみ代入可能で、 a = "abc"などはエラーになります char d[4]; d[0] = 'a'; d[1] = 'b'; d[2] = 'c'; d[3] = '\0'; と同じです  '\0'は文字コード0で、文字列の 最後を意味します 255より多い文字数も可能です   何月かを入力し英語を表示する 月以外の数値の入力で終了する   BASICでは、 100 DIM M$(11) 110 M$(0) = "January": M$( 1) = "February": M$( 2) = "March" 120 M$(3) = "April"  : M$(