11 アセンブラCASL2ループでドット、市松模様をお絵かき(=^・^=)

この記事では、アセンブラ言語で「多重ループ」を使った簡単なドット絵(市松模様)のサブルーチンと、おすすめの本の紹介を掲載しております。

この記事では、こちらのWebのシミュレーターを使っています。
ダウンロードすることなく、素早くアセンブラの勉強が出来る、私が使った中で1番便利なシミュレーターです。

COMET2のアセンブラのCASL2で、簡単なドット絵を作ってみたくて、
市松模様を作りました。
「X」の文字が入った2つの配列を使って、こんな感じに出力しました。

GR1が奇数の時は、配列 ODDA「X X X」と出力して、GR1の値が偶数の時は、配列 EVENA「 X X 」と出力し、交互に出力することで、市松模様を書いています。

GR1の値で振り分けて、市松模様を描くイメージ的は、こんな感じです。

GR1の値をラベルEVEN(偶数)とODD(奇数)に処理を振り分けています。
偶数か奇数かの判定は、GR1をGR2にコピーして、GR2を右に1ビットシフトして、オーバーフローすれば奇数、しなければ偶数にしています。

プログラムはこんな感じです。

TEST START
 RPUSH
 LAD GR1,1;GR1に1を読み込む

;<<市松模様の描画ループ>>
LOOP LD GR2,GR1;GR2にGR1をコピー
 SRL GR2,1;GR2を右に1ビットシフト
 JOV ODD;オーバーフローしたら奇数なので、ODDに分岐する

EVEN OUT EVENA,LEN;偶数だったら「 X X 」を出力
 JUMP SKIP;奇数の出力をスキップする
ODD OUT ODDA,LEN;奇数だったら「X X X」を出力
SKIP LAD GR1,1,GR1;GR1をインクリメント
 CPL GR1,=5;GR1を5と比較
 JPL FIN;5を超えた場合はFINへ分岐
 JUMP LOOP;ループ先頭へ分岐 

FIN RPOP
 RET

EVENA DC ' X X '
ODDA DC 'X X X'
LEN DC 5

 END

それでは、実際にシミュレーターを使って動かしていきます。

GR1に1が入りました。

GR2にGR1の値がコピーされました。

GR2の値が右に1ビットシフトして、1は奇数なのでオーバーフローしました。

ラベルODDに分岐して、配列ODDAが出力されました。

GR1をインクリメントしました。

GR1=2は、5より小さいのでサインフラグが立ちました

ループの先頭に戻ります。

GR1の値が、GR2にコピーされました。

GR2が右に1ビットシフトして、偶数でのでOFフラグは立ちません。

偶数なので、配列EVENAが出力出来ました。

GR1がインクリメントされて、3になりました。

GR1=3は5より小さいので、このままループを継続します。

この様に繰り返していって、市松模様が描画されました。

お疲れ様でした。
勉強のリフレッシュに、写真で息抜きを致します。

東京駅丸の内のシャンパンゴールドのイルミネーションです。

ここから、復習&アウトプットタイムです!!
下記のコードをシミュレーターにコピペして、コメントを頼りに先ほどのコードを覚えているか入力して見て下さい。

上手く動いたら、値などを好きなように変えて動かして見て下さい。

この復習は学習直後は勿論、明日など少し日を開けて行うと、更に効果的です!!

TEST START
 RPUSH
 LAD GR1,1;GR1に1を読み込む

;<<市松模様の描画ループ>>
;GR2にGR1をコピー
;GR2を右に1ビットシフト
;オーバーフローしたら奇数なので、ODDに分岐する

;偶数だったら「 X X 」を出力
;奇数の出力をスキップする
;奇数だったら「X X X」を出力
;GR1をインクリメント
;GR1を5と比較
;5を超えた場合はFINへ分岐
;ループ先頭へ分岐 

FIN RPOP
 RET

EVENA DC ' X X '
ODDA DC 'X X X'
LEN DC 5

 END

皆さま、大変お疲れ様でした。
この記事最後のブレイクタイムPhotoは・・・

東京駅です。

仕事や勉強のリフレッシュに、趣味で写真を撮っておりますので、宜しかったら フォトストック写真ACさん の投稿もご覧頂けますと、大変嬉しい限りでございます!!

こちら、無料の「ダウンロードユーザー」に登録して頂けると、無料で写真のダウンロードが可能になります。

※ 先にGoogleアカウントを作成して頂くと、登録が ラク です♪

写真素材素材【写真AC】

 

最後までご精読、誠にありがとうございました!!

自己紹介


アセンブラ自作サンプルとFE出題範囲のアリゴリズムへ

アセンブラ過去問プログラムへ


プログラミング未経験者はアセンブラと表計算どっち!?



基本情報技術者試験トップへ

午前免除試験

午後試験のオススメ本

スコアレポート

04 CASL2アセンブラ 番町皿屋敷で納涼ループ

この記事では、アセンブラ言語で簡単なループとインクリメントをして、番長皿屋敷のお皿の枚数を数える例題を掲載しております。

怪談話で有名な、「1ま〜い」、「2ま〜い」・・・と数えていくのは、プログラミングの基礎トレーニングになると思います。

世間では「地球沸騰化」、なんて言っていますね。
多分2023年のトレンドになるのではないでしょうか。

毎日暑いので、アセンブラの勉強では涼しくなりたいです。
そこで、怪談話を題材に、プログラミングをしてみようと思いつきました。
個人的には「番町皿屋敷」は、プログラミングの中でもループの勉強になると思います。

1ま~~~い、
2ま~~~い、

そう、ループとインクリメントです!
アセンブラCASL2を使って基本情報技術者試験対策も兼ねて
下記の結果になるプログラミングをしてみました。

LADとLDの違いについては、こちらの外部記事が分かりやすいです。

TEST START
 RPUSH

 LAD GR1,1;GR1に1を設定

;<< ここからループ >>
LOOP LD GR2,GR1;GR2にGR1の数を読み込む
 ADDL GR2,='0';GR2の値に文字コード「'0'」を加算
 ST GR2,SARA;GR2の値をSARAに格納
 OUT SARA,LEN;皿の枚数を出力
 LAD GR1,1,GR1;GR1をインクリメント
 CPL GR1,=10;GR1が10まで達したのか比較(ループを続けるか否かの判断)
 JMI LOOP;GR1が10未満であれば、ループは続行

 OUT MOJI,LEN2;「サラ割れた」のメッセージ出力

 RPOP
 RET

SARA DS 1;皿に文字数1枠を確保する
TANI DC 'MA-I';皿の単位の数え方は「枚(まーい)」
LEN DC 5;1枚は「1MA-I」と5文字で表示
MOJI DC 'SARA WARETA!';「皿割れた」の文字列
LEN2 DC 12;上記の皿の文字列の字数

 END

それでは、このサブルーチンを実行していきます。
まず、GR1に1を設定します。

GR1はループカウンタ用に使って、GR2は皿の枚数の出力用に使うので、GR1の値をGR2に写します。
GR2にGR1の値を読み込みます。

GR2の値を使って、「1まーい」と出力したいのですが、そのためには文字コードの理解が必要になります。

紛らわしいのですが、「’1’」の文字コードは「0001」ではなく、「0031」です。
つまり、OUT命令で「1」と出力したいのであれば、文字コードを踏まえて「+30」してから出力します。

そこで、ADDL命令でGR2に「’0’」を足しておりますが、CASL2での「’0’」の文字コードは「0030」です。

この辺りの説明が分かりにくい際には、CASL2の文字コードについてこちらの外部記事が分かりやすいです。

ST命令で文字列SARAにGR2の「+30」をした値を格納してOUT命令で右側のコンソールに出力しています。

STの文字数は1文字、単位の「MA-I」は4文字なので、LENには合わせて5文字分出力出来るように5と設定しています。

現在GR1は1枚なので、LADを使ってインクリメントして、GR1の値を「2」にします。


その、インクリメントの仕組みなのですが、

LAD GR1,1,GR1

で、GR1に「GR1の値+1番地」の値アドレス値を送ることによって、GR1自身に、1加算のインクリメントをしています。


この仕組みについては、先ほどのLDとLADの違いの外部記事が参考になり、ロードアドレス命令を用いた加算については、こちらの外部記事に掲載されています。

ちょっと面倒だな〜〜と思われた方は、ループでのインクリメントのテクニックなんだな、程度に軽く流してもらっても大丈夫です。

インクリメントによって、GR1の値は1から2に1つ増えました。
CPLで「10」と比較して、10よりも小さかったらJMIでLOOPに戻ります。

現在GR1の値は「2」であり、2は10より小さいので、フラグのSFがマイナスとなり、LOOPに戻ります。

このSFがマイナスになった仕組みですが、アセンブラでは比較の時に減算が行われます。

CPL GR1,=10;GR1が10まで達したのか比較(ループを続けるか否かの判断)

ここで、GR1が2なので、10と比較するために「2-10=マイナスの値」と計算されて、SFフラグがマイナスなので「1」になったという仕組みです。

それで、JMIでマイナスになったのでLOOPまで戻って、このループをGR1の値が10未満の間は繰り返されます。



あとは繰り返しなので、「9まーい」が出力される所まで進めます。
現在、「8まーい」まで出力されていて、コンソールの表示はこのようになっています。

レジスタの値は、このようになっています。
GR1が「9」なので、10未満の為SFフラグが1であり、LOOPまで戻ってきました。

GR2にGR1の値が読み込まれます。

GR2に「’0’」を加算することによって、文字コードが30足されます。
「0009」から「0039」になって、文字「9」が出力出来るようになりました。

ST命令で、文字「9」をSARAに格納します。

OUT命令でコンソールに「9まーい」が出力されました。

LAD命令でGR1がインクリメントされて、「9」から「A」になりました。
16進数では、Aは10です。

16進数が苦手な方は、こちらの外部記事が分かりやすいです。

CPLで10になったGR1と10が比較され、ここでも減算が用いられ、GR1-10=0なので、ゼロフラグが立って1になりました。

なので、JMIによる分岐は行われずにループを抜けました。

ループを抜けた所で、「皿割れた」のメッセージが出力されます。

最後の「SARA WARETA!」ですが、
これは、そのお皿が ”さらわれた”と、皿が割れたのダジャレです。

ちょっと怖かったですか(笑)

これで少しでも体感温度下がりましたら夏を乗り切れそうです。

お疲れ様でした。
ここで一旦、写真で休憩を挟みます。

千葉県の房総半島の外房、御宿の海です。


ここから、復習&アウトプットタイムです!!
下記のコードをシミュレーターにコピペして、コメントを頼りに先ほどのコードを覚えているか入力して見て下さい。

上手く動いたら、値などを好きなように変えて動かして見て下さい。

この復習は学習直後は勿論、明日など少し日を開けて行うと、更に効果的です!!

TEST START
 RPUSH

;GR1に1を設定

;<< ここからループ >>
;GR2にGR1の数を読み込む
;GR2の値に文字コード「'0'」を加算
;GR2の値をSARAに格納
;皿の枚数を出力
;GR1をインクリメント
;GR1が10まで達したのか比較(ループを続けるか否かの判断)
;GR1が10未満であれば、ループは続行

;「サラ割れた」のメッセージ出力

 RPOP
 RET

SARA DS 1;皿に文字数1枠を確保する
TANI DC 'MA-I';皿の単位の数え方は「枚(まーい)」
LEN DC 5;1枚は「1MA-I」と5文字で表示
MOJI DC 'SARA WARETA!';「皿割れた」の文字列
LEN2 DC 12;上記の皿の文字列の字数

 END


皆さま、大変お疲れ様でした。
この記事最後のブレイクタイムPhotoは・・・

江ノ島の岩場です。
片瀬江ノ島駅から徒歩数分のところで船に乗れましたので、岩場まで行って来ました。

仕事や勉強のリフレッシュに、趣味で写真を撮っておりますので、宜しかったら フォトストック写真ACさん の投稿もご覧頂けますと、大変嬉しい限りでございます!!

こちら、無料の「ダウンロードユーザー」に登録して頂けると、無料で写真のダウンロードが可能になります。

※ 先にGoogleアカウントを作成して頂くと、登録が ラク です♪

写真素材素材【写真AC】

 

最後までご精読、誠にありがとうございました!!

自己紹介


アセンブラ自作サンプルとFE出題範囲のアリゴリズムへ

アセンブラ過去問プログラムへ


プログラミング未経験者はアセンブラと表計算どっち!?



基本情報技術者試験トップへ

午前免除試験

午後試験のオススメ本

スコアレポート

10アセンブラCASL2で「ソーシャルディスタンス」を大文字に変換

この記事ではアセンブラ言語で、「Social Distance(ソーシャルディスタンス)」の文字列を、文字コードの演算を使って、小文字から大文字に変換する処理を学べます。

また、少しでも伝わりやすくなればと思い、シンプルな図解を掲載させて頂きました。

この記事では、こちらのWebのシミュレーターを使っています。
ダウンロードすることなく、素早くアセンブラの勉強が出来る、私が使った中で1番便利なシミュレーターです。

ソーシャルディスタンスは、英語で書くと「Social Distance」です。
大文字と小文字が交じっておりますが、この文字列を全部大文字に変換する
サブルーチンを作りました。

イメージはこちらです。

配列MOJIがあって、緑色の所が大文字に変換した所です。
この配列は、添え字が0番目から14番目まであります。


レジスタはGR1~GR3まで使い、それぞれの役割は、

GR1が「Social Distance」が格納されている配列の先頭アドレスから最後尾のアドレスまで、処理中の文字のアドレスを指し示し、

GR2は文字数の15で、ループカウンタとして使います。

GR3は、GR1が指し示すアドレスの中身、つまり処理中の文字そのものを指します。

大文字の文字コードは、小文字の文字コードよりも20小さいです。
例えば、’A’ は「0041」で、’a’は「0061」です。

そこで、文字コードが小文字の’a’の「0061」より小さい場合は大文字として判断します。

最初の文字の ‘S’ は大文字なのでそのままです。
大文字のSの文字コードは「0053」です。

文字コードが小文字の’a’の「0061」より小さい場合は大文字として判断するので、この場合は、変換の処理を飛ばします。

‘a’以上で、’z’の「007A」以下の場合は大文字変換の対象になりますので、文字コードを20マイナスします。

文字コードについてはこちらの外部記事が分かりやすいです。

出力結果です。

プログラムはこちらです。
少しでも「密」を避けて、早くコロナが収まりますように、という願いを込めて作ってみました。

TEST START
 RPUSH
 OUT MOJI,LEN
 LAD GR1,MOJI ;GR1にMOJIの先頭アドレスを指定
 LD GR2,LEN   ;GR2に文字数を格納
 CALL UPPER   ;大文字に変換するサブルーチンUPPERを呼び出す
 OUT MOJI,LEN
 RPOP
 RET
MOJI DC 'Social Distance'
LEN DC 15

;大文字に変換するサブルーチンUPPER
UPPER RPUSH

;<<大文字判定ループ>>
LOOP LD GR3,0,GR1  ;GR3に配列MOJIの文字を読み込む
 CPL GR3,='a'      ;その文字の文字コードを小文字の「a」と比較
 JMI SKIP          ;文字コードがaより小さかったらSKIPへ分岐
 CPL GR3,='z'      ;小文字の「z」と比較
 JPL SKIP
 SUBL GR3,=#20     ;文字コードを20引いて「小文字 → 大文字」に変換
 ST GR3,0,GR1      ;上で大文字にした文字を配列MOJIに格納
SKIP LAD GR1,1,GR1     ;配列MOJIを1つ先に進める
 SUBL GR2,=1       ;ループカウンタにしているGR2から1を引く
 JPL LOOP          ;ループカウンタがプラスであればLOOPへ

 RPOP
 RET

 END

では、実際に動かしてみます。

サブルーチンの中で、更にサブルーチンUPPER(大文字に変換するサブルーチン)を呼び出して、戻ってきたら大文字に変換した文字列を出力します。

最初のOUT命令で、元の文字列が出力されます。

GR1に、配列MOJIの先頭アドレスが入ります(実行環境によって異なります。)

GR2に、文字数15(16進数でF)が入ります。

GR3に、最初の文字の大文字のS(文字コード0053)が入ります。

小文字の’a’(文字コード0061)と比較して、小さかったのでSFのフラグが立ちました。

文字列を次に進めます。

ループカウンタをデクリメントします。

ループの先頭に戻ります。

次の文字、小文字の’o’(文字コード006F)を読み込みます。

小文字の’z’より小さいのでフラグが立ちました。
つまり、小文字の’o’は、’a’以上’z’以下ですので、小文字だと判定され、大文字に変換する処理の対象となります。

大文字に変換するのに、文字コードを20マイナスしました。
大文字に変換した’O’ を配列に格納します。

配列を1つ先に進めます。

ループカウンタを1つデクリメントしました。

ループの先頭に戻ります。
これを、「Social Distance」の最後の文字「e」まで進めます。

「c」の処理が終わり、ループカウンタがデクリメントされ、ループの先頭に戻った所のレジスタの値です。

GR3に、最後の文字「e(文字コード65)」が入りました。

a以上z以下なので、大文字に変換対象です。
文字コードがマイナス20されました。

GR2のループカウンタがデクリメントされて、ゼロフラグが立って、ループを抜けます。

お疲れ様でした。
ここで一旦、写真で休憩を挟みます。

瀬戸内しまなみ海道の海です。
撮影したのは平成15年(2003年)で、写ルンですで撮影した写真を復刻しました。


ここから、復習&アウトプットタイムです!!
下記のコードをシミュレーターにコピペして、コメントを頼りに先ほどのコードを覚えているか入力して見て下さい。

上手く動いたら、値などを好きなように変えて動かして見て下さい。

この復習は学習直後は勿論、明日など少し日を開けて行うと、更に効果的です!!

TEST START
 RPUSH
 OUT MOJI,LEN
;GR1にMOJIの先頭アドレスを指定
;GR2に文字数を格納
;大文字に変換するサブルーチンUPPERを呼び出す
 OUT MOJI,LEN
 RPOP
 RET
MOJI DC 'Social Distance'
LEN DC 15

;大文字に変換するサブルーチンUPPER
UPPER RPUSH

;<<大文字判定ループ>>
;GR3に配列MOJIの文字を読み込む
;その文字の文字コードを小文字の「a」と比較
;文字コードがaより小さかったらSKIPへ分岐
;小文字の「z」と比較
;文字コードがzより大きかったらSKIPへ分岐
;文字コードを20引いて「小文字 → 大文字」に変換
;上で大文字にした文字を配列MOJIに格納
;配列MOJIを1つ先に進める
;ループカウンタにしているGR2から1を引く
;ループカウンタがプラスであればLOOPへ

 RPOP
 RET

 END

皆さま、大変お疲れ様でした。
この記事最後のブレイクタイムPhotoは・・・

しまなみ海道の夕暮れです。

仕事や勉強のリフレッシュに、趣味で写真を撮っておりますので、宜しかったら フォトストック写真ACさん の投稿もご覧頂けますと、大変嬉しい限りでございます!!

こちら、無料の「ダウンロードユーザー」に登録して頂けると、無料で写真のダウンロードが可能になります。

※ 先にGoogleアカウントを作成して頂くと、登録が ラク です♪

写真素材素材【写真AC】

 

最後までご精読、誠にありがとうございました!!

自己紹介


アセンブラ自作サンプルとFE出題範囲のアリゴリズムへ

アセンブラ過去問プログラムへ


プログラミング未経験者はアセンブラと表計算どっち!?



基本情報技術者試験トップへ

午前免除試験

午後試験のオススメ本

スコアレポート

09 アセンブラCASL2で推しのライブまでの日数をカウントダウン!!

この記事ではアセンブラ言語で、単純なループとデクリメントを通してカウントダウンの処理が学べます。

過去問でも分岐命令JPL(比較対象の数よりも大きい場合に分岐)なども出てきましたので、過去問前の腕試しに読んで頂けたら嬉しいです。

推しのライブまで後何日かといったことを求めるサブルーチンを作ってみました。

この記事では、こちらのWebのシミュレーターを使っています。
ダウンロードすることなく、素早くアセンブラの勉強が出来る、私が使った中で1番便利なシミュレーターです。


まず、OUT命令で「Enter your favorite name(推しの名前を入力)」と出力します。
その後、INとOUT命令で、あなたの推しの名前を入出力します。


推しのライブまでの日数を5days、4days、3days、2daysまでカウントダウンして、
その後「1-DAY!! TOMORROW」、「DAISUKI!!」と出力します。

日数が5,4,3,2,とカウントされ行き2日までは、day”s”ですよね、複数形で。
「days.」という日数の単位も含めて出力しております。

ここから、プログラムの一部である、ループの部分を抜粋をします。
GR1を日数の5から1までのループカウンタに使います。

ループに入る前に、ループカウンタGR1に5を読み込みます。

日数をDAYSに格納して出力する際、5を出力する場合は、’5’の文字コードは「0035」です。

GR2に’0’(文字コード0030)を読み込んで、GR1の5とGR2の「0030」を加算して、GR2を「0035」にすることによって出力しています。

出力の際、ST命令でDAYSに格納してOUT命令で出力しています。

文字コードについてはこちらの外部記事が分かりやすいです。

;<<ここからループ>>

LOOP LD GR2,='0' ;GR2に'0'を読み込む
 ADDL GR2,GR1 ;出力する為、文字コード'0'(0030)が入っているGR2にGR1を加算
 ST GR2,DAYS ;ST命令でGR2の日数をDAYSに格納する
 OUT DAYS,LEND ;OUT命令でDAYSに入っている日数を出力
 SUBL GR1,=1 ;GR1をデクリメント
 CPL GR1,=1 ;GR1の値と1を比較 ココ注目!!
 JPL LOOP ;GR1が1より大きい間はループを繰り返す ココ注目!!

;<<ループここまで>>

上記のコードの抜粋部分の下から2つ目と1番下の、ココ注目!! と書いてある箇所をご覧下さい。

日数5、4、3、2までは、日数(GR1)>1ですよね。

そこで、CPL命令を使ってGR1のカウンタの値と1を比較し、ライブまでの日数>1、つまり2日まででしたら、ループを繰り返すという命令にしました。

JPLで、1と比べてPLUSでしたらLOOPへジャンプして分岐しています。

分岐命令についてはこちらの外部記事が分かりやすいです。

カウントダウンして、ライブ前日である日数が1日になったらループを抜けます。
ループを抜けた後は、「明日」の出力と、推しへの愛を込めて「DAISUKI!!」と出力します。

では、プログラム全てです。

TEST START
 RPUSH

 OUT NAME,LEN ;OUT命令で「Enter your favorite name(推しの名前を入力)」を出力
 IN OSHI,LENO ;IN命令で推しの名前を入力
 OUT OSHI,LENO ;入力した名前を出力

 LAD GR1,5 ;GR1に5を読み込む(GR1をループカウンタに使用)

;<<ここからループ>>

LOOP LD GR2,='0' ;GR2に'0'を読み込む
 ADDL GR2,GR1 ;出力する為、文字コード'0'(0030)が入っているGR2にGR1を加算
 ST GR2,DAYS ;ST命令でGR2の日数をDAYSに格納する
 OUT DAYS,LEND ;OUT命令でDAYSに入っている日数を出力
 SUBL GR1,=1 ;GR1をデクリメント
 CPL GR1,=1 ;GR1の値と1を比較
 JPL LOOP ;GR1が1より大きい間はループを繰り返す

;<<ループここまで>>

 OUT DAY1,LEND1 ;OUT命令であと1日と出力
 OUT MSG,LENM ;OUT命令で推しに「DAISUKI!!」と出力


 RPOP
 RET

NAME DC 'Enter your favorite name!';文字列「Enter your favorite name!」
LEN DC 25 ;その文字数
OSHI DS 256 ;推しの名前の領域を確保
LENO DS 256 ;推しの名前の文字数の領域を確保
DAYS DS 1 ;日数の領域を確保
LEND DC 7 ;日数の文字数
DAYCOUNT DC 'days.' ;出力する日数の単位
DAY1 DC '1-DAY!! TOMORROW!!' ;あと1日の文字列
LEND1 DC 18 ;あと1日の文字数
MSG DC 'DAISUKI!!' ;文字列「DAISUKI!!」
LENM DC 9 ;その文字数

 END

では、実際に動かしてみます。
推しの名前は「山田太郎(TARO.YAMADA)」とします。

「推しの名前を入力して下さい」と英文で出力します。

早速、「TARO.YAMADA」と入力します。

(このシミュレーターでは、入力とともにコンソールに表示されます。)

推しの名前を出力します。

GR1にループカウンタの5が入りました。

<<ここからループです。>>

GR2に文字コードの’0’である「0030」が読み込まれました。

GR2に「0030」とGR1の「0005」が加算され、「0035」になりました。

ST命令で「0035」である’5’がDAYSに格納されました。

コンソールに「あと5日」の出力をしました。

GR1をデクリメントして4が入りました。

GR1の値(現在4)と1を比較します。

1より大きいので、ループの先頭に戻ります。

———-

GR2に文字コードの’0’である「0030」が読み込まれました。

GR2に「0030」とGR1の「0004」が加算され、「0034」になりました。

ST命令で「0034」である’4’がDAYSに格納されました。

コンソールに「あと4日」の出力をしました。

GR1をデクリメントして3が入りました。

GR1の値(現在3)と1を比較します。

1より大きいので、ループの先頭に戻ります。

———-

GR2に文字コードの’0’である「0030」が読み込まれました。

GR2に「0030」とGR1の「0003」が加算され、「0033」になりました。

ST命令で「0033」である’3’がDAYSに格納されました。

コンソールに「あと3日」の出力をしました。

GR1をデクリメントして2が入りました。

GR1の値(現在2)と1を比較します。

1より大きいので、ループの先頭に戻ります。

———-

GR2に文字コードの’0’である「0030」が読み込まれました。

GR2に「0030」とGR1の「0002」が加算され、「0032」になりました。

ST命令で「0032」である’2’がDAYSに格納されました。

コンソールに「あと2日」の出力をしました。

GR1をデクリメントして1が入りました。

GR1の値(現在2)と1を比較します。

1と等しいので、ZF(ゼロフラグ)が立ちました。

<<ループはここまで>>

ループを抜けました。

「あと1日、ついに明日」と出力されました。

「大好き!!」、と出力されました。

お疲れ様でした。
ここで一旦、写真で休憩を挟みます。

日暮里駅から徒歩数分の、「夕やけだんだん」です。
東京下町の観光地、谷根千、谷中銀座付近の観光スポットです。


ここから、復習&アウトプットタイムです!!
下記のコードをシミュレーターにコピペして、コメントを頼りに先ほどのコードを覚えているか入力して見て下さい。

上手く動いたら、値などを好きなように変えて動かして見て下さい。

この復習は学習直後は勿論、明日など少し日を開けて行うと、更に効果的です!!

TEST START
 RPUSH

;OUT命令で「Enter your favorite name(推しの名前を入力)」を出力
;IN命令で推しの名前を入力
;入力した名前を出力

;GR1に5を読み込む(GR1をループカウンタに使用)

;<<ここからループ>>

;GR2に'0'を読み込む
;出力する為、文字コード'0'(0030)が入っているGR2にGR1を加算
;ST命令でGR2の日数をDAYSに格納する
;OUT命令でDAYSに入っている日数を出力
;GR1をデクリメント
;GR1の値と1を比較
;GR1が1より大きい間はループを繰り返す

;<<ループここまで>>

;OUT命令であと1日と出力
;OUT命令で推しに「DAISUKI!!」と出力


 RPOP
 RET

NAME DC 'Enter your favorite name!';文字列「Enter your favorite name!」
LEN DC 25 ;その文字数
OSHI DS 256 ;推しの名前の領域を確保
LENO DS 256 ;推しの名前の文字数の領域を確保
DAYS DS 1 ;日数の領域を確保
LEND DC 7 ;日数の文字数
DAYCOUNT DC 'days.' ;出力する日数の単位
DAY1 DC '1-DAY!! TOMORROW!!' ;あと1日の文字列
LEND1 DC 18 ;あと1日の文字数
MSG DC 'DAISUKI!!' ;文字列「DAISUKI!!」
LENM DC 9 ;その文字数

 END

アセンブラCASL2のおススメ本です。

皆さま、大変お疲れ様でした。
この記事最後のブレイクタイムPhotoは・・・

谷根千の招き猫です。

仕事や勉強のリフレッシュに、趣味で写真を撮っておりますので、宜しかったら フォトストック写真ACさん の投稿もご覧頂けますと、大変嬉しい限りでございます!!

こちら、無料の「ダウンロードユーザー」に登録して頂けると、無料で写真のダウンロードが可能になります。

※ 先にGoogleアカウントを作成して頂くと、登録が ラク です♪

写真素材素材【写真AC】

 

最後までご精読、誠にありがとうございました!!

自己紹介


アセンブラ自作サンプルとFE出題範囲のアリゴリズムへ

アセンブラ過去問プログラムへ


プログラミング未経験者はアセンブラと表計算どっち!?



基本情報技術者試験トップへ

午前免除試験

午後試験のオススメ本

スコアレポート

08 アセンブラCASL2で関東地方の観光地巡り

この記事ではアセンブラ言語で、入力された数値によって処理を分岐させ、関東地方の有名な観光地の名称を出力するサブルーチンを作りました。

JNZなどの分岐命令では過去問でも見かけましたので、過去問に取り組む前の腕試し的に読んで頂けましたら幸いです。

この記事では、こちらのWebのシミュレーターを使っています。
ダウンロードすることなく、素早くアセンブラの勉強が出来る、私が使った中で1番便利なシミュレーターです。

実行して、

「1」を入力すると「YOKOHAMA(横浜)」
「2」を入力すると「SKYTREE(東京スカイツリー)」
「3」は「ONJYUKU(御宿おんじゅく・・・千葉県房総半島の外房の海辺の町)」
「4」は「ODAIBA(お台場)」

と出力されるように致しました。

場所をLOCATE、LENの後の番号はそれぞれの場所の文字数、場所2以降はL2などのラベルに分岐しております。

該当しない場合は、ラベルOTHERの所で1-4のキーの入力を促すメッセージを出力します。

コードはこちらです。

TEST START
 RPUSH

 IN LOCATE,LEN ;観光地の番号を入力する
 LD GR1,LOCATE ;GR1に入力した観光地の番号を読み込む
 CPL GR1,='1' ;GR1と番号'1'を比較
 JNZ L2 ;等しくなければL2に分岐する
 OUT LOCATE1,LEN1 ;1であれば「YOKOHAMA」と出力
 JUMP FIN ;ラベルFINに分岐

L2 CPL GR1,='2' ;ラベルL2ではGR1と'2'を比較する
 JNZ L3 ;等しくなければL3に分岐する
 OUT LOCATE2,LEN2 ;2であれば「SKYTREE」をと出力
 JUMP FIN ;ラベルFINに分岐

L3 CPL GR1,='3' ;ラベルL3ではGR1と'3'を比較する
 JNZ L4 ;等しくなければL4に分岐する
 OUT LOCATE3,LEN3 ;3であれば「ONJYUKU」と出力
 JUMP FIN ;ラベルFINに分岐

L4 CPL GR1,='4' ;ラベルL4ではGR1と'4'を比較する
 JNZ OTHER ;等しくなければOTHERに分岐する
 OUT LOCATE4,LEN4 ;4であれば「ODAIBA」と出力
 JUMP FIN ;ラベルFINに分岐

OTHER OUT NOTHING,LEN5 ;ラベルOTHERでは文字列NOTHINGと文字数LEN5で出力 

FIN  RPOP
 RET

LOCATE DS 256 ;場所の領域を確保
LEN DC 1 ;文字数1文字
LOCATE1 DC 'YOKOHAMA' ;最初の場所横浜
LEN1 DC 8 ;横浜の文字数
LOCATE2 DC 'SKYTREE' ;2番目の場所スカイツリー
LEN2 DC 7 ;スカイツリーの文字数
LOCATE3 DC 'ONJYUKU' ;3番目の場所御宿
LEN3 DC 7 ;御宿の文字数
LOCATE4 DC 'ODAIBA' ;4番目の場所お台場
LEN4 DC 6 ;お台場の文字数
NOTHING DC 'PREASE ENTER 1-4' ;1から4までを入力するようにメッセージ
LEN5 DC 16 ;その他の場合の文字数


 END

シミュレーターを動かして見ます。
インプットボックスで「1」と入力します。

このシミュレーターでは入力するとコンソールに表示されます。

‘1’、文字コード「0031」がGR1に入ります。
※ 1の文字コードは「0001」ではなく「0031」です。
文字コードについてはこちらの外部記事が分かりやすいです。

CPLでGR1が’1’と等しいか比較します。
等しいのでZE(ゼロフラグ)が立ちました。

JNZで等しくない場合はラベルL2に分岐します。
今回は等しいので分岐はせずに進みます。

OUT命令で、YOKOHAMAが出力されました。

その後FINラベルに分岐してプログラムが終了しました。

同様に、2,3,4も入出力して見ます。

では、次は1-4以外の、例えば’8’などを入力してその動きをトレース致します。

GR1に文字コード「0038」が入りました。

GR1は’1’と等しくないのでラベルL2に分岐します。

GR1は’2’とも等しくないのでL3に分岐します。

GR1は’3’とも等しくないのでL4に分岐します。

GR1は’4’とも等しくないので、ラベルOTHERに分岐します。

OUT命令で1-4までを入力するよう促すメッセージが出力されました。

お疲れ様でした。
ここで一旦、写真で休憩を挟みます。

横浜みなとみらいの夜景です。
ランドマークタワーから撮影しました。

スカイツリーのライトアップと河津桜です。


ここから、復習&アウトプットタイムです!!
下記のコードをシミュレーターにコピペして、コメントを頼りに先ほどのコードを覚えているか入力して見て下さい。

上手く動いたら、値などを好きなように変えて動かして見て下さい。

この復習は学習直後は勿論、明日など少し日を開けて行うと、更に効果的です!!

関東以外の観光地や、あなたの行ってみたい場所など、好きなようにアレンジしてみて下さい!!

TEST START
 RPUSH

;観光地の番号を入力する
;GR1に入力した観光地の番号を読み込む
;GR1と番号'1'を比較
;等しくなければL2に分岐する
;1であれば「YOKOHAMA」と出力
;ラベルFINに分岐

;ラベルL2ではGR1と'2'を比較する
;等しくなければL3に分岐する
;2であれば「SKYTREE」をと出力
;ラベルFINに分岐

;ラベルL3ではGR1と'3'を比較する
;等しくなければL4に分岐する
;3であれば「ONJYUKU」と出力
;ラベルFINに分岐

;ラベルL4ではGR1と'4'を比較する
;等しくなければOTHERに分岐する
;4であれば「ODAIBA」と出力
;ラベルFINに分岐

;ラベルOTHERでは文字列NOTHINGと文字数LEN5で出力 

FIN  RPOP
 RET

LOCATE DS 256 ;場所の領域を確保
LEN DC 1 ;文字数1文字
LOCATE1 DC 'YOKOHAMA' ;最初の場所横浜
LEN1 DC 8 ;横浜の文字数
LOCATE2 DC 'SKYTREE' ;2番目の場所スカイツリー
LEN2 DC 7 ;スカイツリーの文字数
LOCATE3 DC 'ONJYUKU' ;3番目の場所御宿
LEN3 DC 7 ;御宿の文字数
LOCATE4 DC 'ODAIBA' ;4番目の場所お台場
LEN4 DC 6 ;お台場の文字数
NOTHING DC 'PREASE ENTER 1-4' ;1から4までを入力するようにメッセージ
LEN5 DC 16 ;その他の場合の文字数


 END

皆さま、大変お疲れ様でした。
この記事最後のブレイクタイムPhotoは・・・

御宿海岸と

お台場です。

仕事や勉強のリフレッシュに、趣味で写真を撮っておりますので、宜しかったら フォトストック写真ACさん の投稿もご覧頂けますと、大変嬉しい限りでございます!!

こちら、無料の「ダウンロードユーザー」に登録して頂けると、無料で写真のダウンロードが可能になります。

※ 先にGoogleアカウントを作成して頂くと、登録が ラク です♪

写真素材素材【写真AC】

 

最後までご精読、誠にありがとうございました!!

自己紹介


アセンブラ自作サンプルとFE出題範囲のアリゴリズムへ

アセンブラ過去問プログラムへ


プログラミング未経験者はアセンブラと表計算どっち!?



基本情報技術者試験トップへ

午前免除試験

午後試験のオススメ本

スコアレポート

07 アセンブラCASL2、スタックを使って「CMYK」を逆さ取り出し!

この記事ではCASL2アセンブラ言語で、スタックを利用して文字列を逆に取り出すプログラムを作りました。

取り出す文字列は、インクジェットプリンターのインクで使われる「CMYK」です。
その「CMYK」の文字の並びを逆にした、「KYMC」をスタックに積み上げて、スタックの仕組みを利用して「CMYK」にして出力します。

この記事では、こちらのWebのシミュレーターを使っています。
ダウンロードすることなく、素早くアセンブラの勉強が出来る、私が使った中で1番便利なシミュレーターです。

CMYKについて基本情報技術者試験(FE)を受けられる方は既にご存知だと思いますが、簡単にお話しすると、インクジェットプリンターで使われているインクです。

C(シアン)、M(マゼンタ)、Y(イエロー)、K(ブラック)のことで、もう少し詳しく知りたい方は、こちらの外部記事が分かりやすいです。

この配列BEFOREは、逆から読むとCMYKになります。
スタックと言う、イメージ的に積み木みたいな仕組みを使って、
配列BEFOREの「KYMC」を配列AFTERに「CMYK」と出力されるように格納します。

配列BEFOREのすぐ後にあるのは、目印に使う配列ENDでゼロが格納されています。

では、積み木みたいなスタックに積まれて行く様子を図にします。
スタックに積む時にはPUSH命令を使います。

文字の処理が終わったかどうかの目印に、「0(ゼロ)」を使いますので、最初に0をスタックに積みます。

スタックにはPUSH命令で、このように1文字ずつ積み上げていき、取り出す時には
POP命令を使って、一番上(最後に積み上げた文字)から順に取り出します。
取り出した文字を出力用の配列AFTERに格納します。

すると、「KYMC」が「CMYK」になって出力されます。

元の文字列「KYMC」は配列BEFORE[]に入っています。
スタックを使って出力用に格納する配列はAFTER[]です。
どちらも、GR1を使ってアドレスを指し示します。

GR2は、文字列をスタックに積んだり取り出したりする時に使います。
また、GR2は、出力用文字列に格納する時にも使います。

CMYKの文字コードはこちらになります。
‘K’…「004B」
‘Y’…「0059」
‘M’…「004D」
‘C’…「0043」

文字コードについてはこちらの外部記事が分かりやすいです。

それでは、プログラムを掲載致します。

TEST START

 RPUSH

 LAD GR2,0 ;GR2に目印の0を設定
 PUSH 0,GR2 ;スタックにGR2の値を積む
 LAD GR1,BEFORE ;GR1に配列BEFOREの先頭アドレスを設定
 OUT BEFORE,LEN ;配列BEFOREを出力

;<<スタックに積むループPUSH>>
LOOPPUSH LD GR2,0,GR1 ;GR2に配列BEFOREのGR1が指し示す文字を読み込む
 CPL GR2,=0 ;目印の0まで到達したか、GR2の文字と目印0を比較する
 JZE PREPOP ;目印0まで到達したら配列AFTERの準備でPREPOPまで分岐する
 PUSH 0,GR2 ;処理中の場合は読み込んだ文字をスタックに積む
 LAD GR1,1,GR1 ;配列BEFOREの位置を1つ先に進めるのでGR1をインクリメントする
 JUMP LOOPPUSH ;読み込みとスタックに積む処理が完了するまでLOOPPUSHを繰り返す

;配列AFTERの出力準備
PREPOP LAD GR1,AFTER ;GR1に配列AFTERのアドレスを設定

;<<スタックから取り出すループPOP>>
LOOPPOP POP GR2 ;スタックから1文字取り出してGR2に格納
 CPL GR2,=0 ;文字の取り出しが最後の目印まで到達したか確認
 JZE FIN ;等しい(取り出し処理が終了)場合はFINラベルへ
 ST GR2,0,GR1 ;処理中ならGR2で取り出した文字をGR1を使って配列AFTERに格納
 LAD GR1,1,GR1 ;配列AFTERの位置を1つ先に進めるのでGR1をインクリメントする
 JUMP LOOPPOP ;出力処理が終わるまでLOOPPOPを繰り返す


FIN OUT AFTER,LEN ;配列AFTERを出力する


 RPOP
 RET

BEFORE DC 'KYMC'
END DC 0
AFTER DS 100
LEN DC 4


 END

ここから、実際にシミュレーターを動かして見て行きます。

GR2に目印となる0を設定し、スタックにその0を積みます。

GR1に配列BEFOREの先頭アドレスを設定します。

OUT命令で元の文字の配列BEFOREをコンソールに出力します。

スタックにPUSHするループ、LOOPPUSHに入り、配列BEFOREの先頭文字の‘K’…「004B」をGR2に読み込みます。

GR2のKと目印の0を比較します。
等しくないのでループを続行します。

スタックに‘K’…「004B」を積みます。

配列BEFOREの位置を1つ進めるのでGR1をインクリメントします。

ループLOOPPUSHを繰り返します。

GR2に‘Y’…「0059」を読み込みます。

Yと目印の0を比較します。
等しくないのでループを続けます。

スタックに‘Y’…「0059」を積みます。

配列BEFOREを1つ先に進めるので、GR1をインクリメントします。

ループLOOPPUSHを繰り返します。

GR2にM’…「004D」を読み込みます。

Mと目印の0を比較します。
等しくないのでループを続けます。

スタックにM’…「004D」を積みます。

配列BEFOREを1つ先に進めるので、GR1をインクリメントします。

ループLOOPPUSHを繰り返します。

GR2に‘C’…「0043」を読み込みます。

Cと目印の0を比較します。

等しくないのでループを続けます。

スタックに‘C’…「0043」を積みます。

配列BEFOREを1つ先に進めるので、GR1をインクリメントします。

ループLOOPPUSHを繰り返します。

GR2に‘目印’、配列ENDの「0」を読み込みます。

GR2と目印の0を比較します。
等しいので、ゼロフラグが立ちました。

分岐命令JZEで、ループを抜けて配列AFTERの出力準備のPREPOPに分岐して、GR1に配列AFTERの先頭アドレスを設定します。

今度は取り出しループのLOOPPOPに入り、スタックから一番上に積まれた‘C’…「0043」をPOP命令で取り出します。

スタックからGR2に取り出された‘C’…「0043」と目印の0を比較します。
等しくないのでループを続けます。

GR2に取り出された‘C’…「0043」を配列AFTERに格納します。

配列AFTERを1つ先に進めるのでGR1をインクリメントします。

ループLOOPPOPに戻ります。

GR2にスタックから一番上に積まれているM’…「004D」をPOP命令で取り出します。

スタックからGR2に取り出されたM’…「004D」と目印の0を比較します。
等しくないのでループを続けます。

GR2に取り出されたM’…「004D」を配列AFTERに格納します。

配列AFTERを1つ先に進めるのでGR1をインクリメントします。

ループLOOPPOPに戻ります。

スタックから一番上に積まれている‘Y’…「0059」をPOP命令で取り出します。

スタックからGR2に取り出された‘Y’…「0059」と目印の0を比較します。
等しくないのでループを続けます。

GR2に取り出された‘Y’…「0059」を配列AFTERに格納します。

配列AFTERを1つ先に進めるのでGR1をインクリメントします。

ループLOOPPOPに戻ります。

スタックから一番上に積まれている‘K’…「004B」をPOP命令で取り出します。

スタックからGR2に取り出された‘K’…「004B」と目印の0を比較します。
等しくないのでループを続けます。

GR2に取り出された‘K’…「004B」を配列AFTERに格納します。

配列AFTERを1つ先に進めるのでGR1をインクリメントします。

ループLOOPPOPに戻ります。

スタックから最後に残った目印の「0」をPOP命令で取り出します。

スタックからGR2に取り出された0と目印の0を比較します。
等しいのでJZE命令でFINラベルに分岐します。

コンソールに配列AFTERを出力します。

お疲れ様でした。
ここで一旦、写真で休憩を挟みます。


目白庭園という日本庭園の紅葉ライトアップです。


ここから、復習&アウトプットタイムです!!
下記のコードをシミュレーターにコピペして、コメントを頼りに先ほどのコードを覚えているか入力して見て下さい。

上手く動いたら、値などを好きなように変えて動かして見て下さい。

この復習は学習直後は勿論、明日など少し日を開けて行うと、更に効果的です!!

このコードでも、推しがいる方はあなたの推しの名前をスタックを使って取り出してみると面白いと思います。

TEST START

 RPUSH

;GR2に目印の0を設定
;スタックにGR2の値を積む
;GR1に配列BEFOREの先頭アドレスを設定
;配列BEFOREを出力

;<<スタックに積むループPUSH>>
;GR2に配列BEFOREのGR1が指し示す文字を読み込む
;目印の0まで到達したか、GR2の文字と目印0を比較する
;目印0まで到達したら配列AFTERの準備でPREPOPまで分岐する
;処理中の場合は読み込んだ文字をスタックに積む
;配列BEFOREの位置を1つ先に進めるのでGR1をインクリメントする
;読み込みとスタックに積む処理が完了するまでLOOPPUSHを繰り返す

;配列AFTERの出力準備
;GR1に配列AFTERのアドレスを設定

;<<スタックから取り出すループPOP>>
;スタックから1文字取り出してGR2に格納
;文字の取り出しが最後の目印まで到達したか確認
;等しい(取り出し処理が終了)場合はFINラベルへ
;処理中ならGR2で取り出した文字をGR1を使って配列AFTERに格納
;配列AFTERの位置を1つ先に進めるのでGR1をインクリメントする
;出力処理が終わるまでLOOPPOPを繰り返す


;配列AFTERを出力する


 RPOP
 RET

BEFORE DC 'KYMC'
END DC 0
AFTER DS 100
LEN DC 4


 END

皆さま、大変お疲れ様でした。
この記事最後のブレイクタイムPhotoは・・・

仕事や勉強のリフレッシュに、趣味で写真を撮っておりますので、宜しかったら フォトストック写真ACさん の投稿もご覧頂けますと、大変嬉しい限りでございます!!

こちら、無料の「ダウンロードユーザー」に登録して頂けると、無料で写真のダウンロードが可能になります。

※ 先にGoogleアカウントを作成して頂くと、登録が ラク です♪

写真素材素材【写真AC】

 

最後までご精読、誠にありがとうございました!!

自己紹介


アセンブラ自作サンプルとFE出題範囲のアリゴリズムへ

アセンブラ過去問プログラムへ


プログラミング未経験者はアセンブラと表計算どっち!?



基本情報技術者試験トップへ

午前免除試験

午後試験のオススメ本

スコアレポート

06アセンブラCASL2、配列で合格(GOUKAKU)を出力!

この記事ではアセンブラ言語で、配列と添字についてのサンプルプログラムを掲載しております。

恐らく、基本情報技術者試験の合格を目指していらっしゃる方がこの記事を読まれていると思いますので、文字列を1文字置きに取り出して「GOUKAKU」の文字を出力するサブルーチンを作りました。


下の配列BEFOREの黄色いセルが、取り出すべき文字の「GOUKAKU」です。
1文字置きに抽出するよう、アドレスを指し示すのに使うGR1は2つずつ加算して、それに対して出力用の配列AFTERの格納用アドレスに使うGR2は1つずつインクリメントして行きます。

最後までトレースすると、この様になります。

配列は添え字が0から始まりますので、GR1とGR2に0を読み込んでいます。
GR3は、元の文字列BEFOREの文字を読み込むのに使います。

文字コードは、

‘G’…「0047」
‘O’…「004F」
‘U’…「0055」
‘K’…「004B」
‘A’…「0041」
‘K’…「004B」
‘U’…「0055」

です。
文字コードはこちらの外部サイトが分かりやすいです。

では、コードを掲載致します。

TEST START

 RPUSH
 LAD GR1,0 ;GR1に配列BEFOREの先頭の添え字0を読み込む
 LAD GR2,0 ;GR2に配列AFTERの先頭の添え字0を読み込む

;<<ここからループ>>
LOOP CPL GR2,=7 ;GR2とAFTER(GOUKAKU)の文字数7文字を比較
 JZE FIN ;等しかったらFINへ分岐
 LD GR3,BEFORE,GR1 ;GR3に配列BEFOREの文字を1つずつ読み込む
 ST GR3,AFTER,GR2 ;GR3の文字を配列AFTERに格納

 LAD GR2,1,GR2 ;AFTERのGR2をインクリメント
 

 LAD GR1,2,GR1 ;BEFOREのGR1を2つ増やす
 JUMP LOOP ;LOOPへ分岐
;<<ここまでループ>>


FIN OUT AFTER,ALEN ;配列AFTERを出力

 RPOP
 RET

BEFORE DC 'GROGUBKCAMKYU' ;配列BEFOREを用意
AFTER DS 7 ;配列AFTERに領域7つ分を確保
ALEN DC 7 ;AFTERの文字数ALENを7文字とする

 END

それでは、実際にシミュレーターを動かして行きます。

GR1に配列BEFOREの添え字0が入ります。

GR2に配列AFTERの添え字0が入ります。

ループに入ります。

GR2(現在0)と文字数の7を比較して、GR2の方が小さいのでSFにフラグが立ちます。
SF(サインフラグ)は比べて小さかった時に「1」が立ちます。
比較する際に減算を用いていて、GR2の0から7を引くとマイナスになるので、SFが立ちました。

GR2と7は等しくないので分岐せずにループを続けます。

GR3にBEFOREの最初の文字’G’(文字コード0047)が入ります。

‘G’を配列AFTERの先頭に格納します。

配列AFTERの添え字を指すGR2をインクリメントします。

配列BEFOREの添え字を指すGR1を2つ増やします。

ループの先頭にジャンプします。

GR2(現在1)とAFTERの文字数7を比較して、GR2の方が小さいので、SFが立ち、分岐をせずにループを続行します。

GR3に’O’…「004F」が読み込まれます。

配列AFTERの添え字1に’O’が格納されます。

GR2をインクリメントします。

GR1を2つ増やします。

この繰り返しで、G,Oと順番に配列AFTERを格納していき、最後の’U’…「0055」を格納する所まで進めます。

(GOUKAKUの、後ろの方の’K’…「004B」を格納した所まで進めます。)

現在シミュレーターは、配列AFTERの添え字であるGR2が6になっていて、格納された文字のGR3が’K’…「004B」となっている所まで進めました。

GR2(現在6)と7を比較して、SFが立ちましたので、ループを続行します。

GR3に’U’…「0055」が入りました。

‘U’を配列AFTERに格納します。

GR2をインクリメントします。

GR1を2つ増やします。

ループの先頭に戻ります。

GR2の現在の値7が比較する7と等しかったので、ZFが立ってFINに分岐します。

FINラベルの所のOUT命令でコンソールに出力されました。

お疲れ様でした。
ここで一旦、写真で休憩を挟みます。

お台場のレインボーブリッジです。
東京タワーがレインボーブリッジの中央より少し右側に写っています。


ここから、復習&アウトプットタイムです!!
下記のコードをシミュレーターにコピペして、コメントを頼りに先ほどのコードを覚えているか入力して見て下さい。

上手く動いたら、値などを好きなように変えて動かして見て下さい。

この復習は学習直後は勿論、明日など少し日を開けて行うと、更に効果的です!!

TEST START

 RPUSH
;GR1に配列BEFOREの先頭の添え字0を読み込む
;GR2に配列AFTERの先頭の添え字0を読み込む

;<<ここからループ>>
;GR2とAFTER(GOUKAKU)の文字数7文字を比較
;等しかったらFINへ分岐
;GR3に配列BEFOREの文字を1つずつ読み込む
;GR3の文字を配列AFTERに格納

;AFTERのGR2をインクリメント
 

;BEFOREのGR1を2つ増やす
;LOOPへ分岐
;<<ここまでループ>>


;配列AFTERを出力

 RPOP
 RET

BEFORE DC 'GROGUBKCAMKYU' ;配列BEFOREを用意
AFTER DS 7 ;配列AFTERに領域7つ分を確保
ALEN DC 7 ;AFTERの文字数ALENを7文字とする

 END

皆さま、大変お疲れ様でした。
この記事最後のブレイクタイムPhotoは・・・

お台場レインボーブリッジと自由の女神です。

仕事や勉強のリフレッシュに、趣味で写真を撮っておりますので、宜しかったら フォトストック写真ACさん の投稿もご覧頂けますと、大変嬉しい限りでございます!!

こちら、無料の「ダウンロードユーザー」に登録して頂けると、無料で写真のダウンロードが可能になります。

※ 先にGoogleアカウントを作成して頂くと、登録が ラク です♪

写真素材素材【写真AC】

 

最後までご精読、誠にありがとうございました!!

自己紹介


アセンブラ自作サンプルとFE出題範囲のアリゴリズムへ

アセンブラ過去問プログラムへ


プログラミング未経験者はアセンブラと表計算どっち!?



基本情報技術者試験トップへ

午前免除試験

午後試験のオススメ本

スコアレポート

05 アセンブラCASL2「LOVE」をループと条件判断で取り出す

この記事ではアセンブラ言語で、文字コードの比較を使って文字列の中から大文字の英字である、「LOVE」を取り出すことを学べます。

単調な勉強ではありますが、「推し」がいる方は推しの方への思いを込めて手を動かして頂けたらと思います。

この記事では、こちらのWebのシミュレーターを使っています。
ダウンロードすることなく、素早くアセンブラの勉強が出来る、私が使った中で1番便利なシミュレーターです。

上記ような、英字と数字が混在した文字列の中から、文字コードを比較して、英字のみを取り出します。

コードを掲載する前に、各汎用レジスタがどのような動きをするのか、図解で掲載致します。

数字の文字コードは、’1’が「0031」、’2’が「0032」・・・’9’が「0039」です。
それに対して英語の大文字は、’A’が「0041」、’B’が「0042」・・・’Z’が「005A」になります。

今回抽出する文字列の、LOVEは、
‘L’…「004C」
‘O’…「004F」
‘V’…「0056」
‘E’…「0045」
になります。

元の文字列(BEFORE)の「9L23OV6E81」の中から、英文字である「L,O,V,E」を取り出します。
どのようにして取り出すのかというその仕組みを簡単に書くと、

・文字コードの比較を行い、数字や記号の場合はスキップする
・英字の場合は出力文字列(AFTER)に格納する

と言った仕組みです。

比較を使って、文字コードが数字の’9’以下の文字の場合は処理をスキップ致します。
前述の通り英文字の文字コードは、数字よりも大きいで、その文字コードの大きさで、英文字か数字かを判断しています。

文字コードについて不安な方は、こちらの外部記事が分かりやすいです。

文字列の位置が分かるような図を掲載致します。

(下の図を見ても分かりづらい場合でも、プログラムを動かしながら1つずつトレースをして行きますので、安心して下さい。)

元の文字列「BEFORE」は、0号室、1号室…9号室まであります。
全部で10文字分なので、BEFOREの文字数BLENにはDCで10を入れます。

出力用の文字列「AFTER」は、0号室、1号室…3号室まであります。


GR1は、元の文字列BEFOREの先頭アドレス「0号室」を指します。

GR2は、出力用文字列AFTERの先頭アドレス「0号室」を指します。

GR4は、GR1が指す「元の文字列BEFOREの0号室の住人」の「’9’」さんを安否確認するように見つめています。

GR3は処理した文字数のカウントに使います。

元の文字列BEFOREの文字数が10文字ですので、処理した文字数をカウントするGR3が10と等しくなった時に、FINラベルに分岐してループを抜けた後に出力処理に移ります。


最初は処理した文字数のカウントのGR3の値は0でBEFOREの文字の長さ(BLEN)の10文字より小さいので、ループの処理を行います。

ループの中で、 GR4が見ている「’9’」さんが「’0’(ゼロ)」さんより小さいか
どうかの判断します。(小さい場合は、「’!’」や「スペース」などの記号です。)
小さくは無いので、このまま進めます。

「’9’」さんは「’9’」と等しいかを判断します。
当てはまったので、英文字ではないことが分かります。
つまり、出力すべき「L,O,V,E」ではないので、処理せずにSKIPへ行きます。

SKIPしたところでは、GR1を0号室から1号室に進めます。

処理した文字数を1つ増やすので、カウントに使うGR3の値が0から1になります。

JUMP命令で、LOOPに戻ります。


ループを続けるのかの判断で、先ほどの図の通り処理した文字数のカウントに使っているGR3が1で、BEFOREの文字の長さBLENの10文字よりも小さいので、ループの処理を行います。

GR1の値が先頭アドレスの0号室から、1つ移動したので、GR1が1号室を指し示します。
今度はGR4は、「’9’」さんの隣にいる「’L’」さんを、安否確認する様に見ています。


GR4が安否確認する様に見ている、 「’L’」さんが英大文字かどうか判断します。
‘L’さんの文字コードは「004C」で、’9’の「0039」よりも大きいので、出力用の文字列のAFTERに格納する処理を行います。


出力用の文字列AFTERのGR2が指し示す0号室に、「’L’」さんを入室許可します。


出力用の文字列AFTERを1つ進めて、GR2は1号室を指します。

元の文字列BEFOREも1つ進めて、GR1は2号室を指します。

処理した文字を1つ増やすので、 GR3が2になります。

その後、またループに戻ります。

ということを繰り返して、「L,O,V,E」と取り出していきます。

それではソースを掲載して、実際にシミュレーターで動かして行きます。


上記の図を見て分かりにくいと思われても、1つ1つトレースをしてシミュレーターの図でレジスタの値の変化が分かるようにスクショしましたので、安心して下さい。

TEST START

 RPUSH
 LAD GR1,BEFORE ;GR1に元の文字列BEFOREの先頭アドレスを格納する
 LAD GR2,AFTER ;GR2に出力用の文字列AFTERの先頭アドレスを格納する
 LAD GR3,0 ;GR3に処理した文字数をカウントする

;<<ここからループ>>
LOOP CPL GR3,BLEN;GR3のカウント数と元の文字列の長さBLENを比較する
 JZE FIN;GR3のカウントが元の文字列の長さと等しかったらFINに分岐する
 LD GR4,0,GR1;GR4に元の文字列からGR1が指し示すアドレスに入っている文字を取得する
 CPL GR4,='0';GR4の文字と'0'(ゼロ)を比較する
 JMI SKIP;'0'より小さかったらSKIPへ分岐する
 CPL GR4,='9';GR4の文字と'9'を比較する
 JMI SKIP;'9'より小さかったらSKIPへ分岐する
 JZE SKIP;'9'と等しかったらSKIPへ分岐する

;出力すべき英字なので出力用の配列に格納する
 ST GR4,0,GR2;GR4の文字を出力用の文字列AFTERに格納する
 LAD GR2,1,GR2;出力用の文字列AFTERを指し示すGR2を1つ先に進める


;数字・英字共通のSKIPラベル
SKIP LAD GR1,1,GR1;元の文字列BEFOREを1つ先に進める
 LAD GR3,1,GR3;処理した文字数のカウント用のGR3をインクリメント
 JUMP LOOP;ループへ戻る


;<<ループはここまで。>>

;ループを抜けた後の出力処理
FIN OUT BEFORE,BLEN;元の文字列を出力する
 LAD GR1,AFTER;GR1に出力用文字列AFTERの先頭アドレスを読み込む
 SUBL GR2,GR1;出力用文字列AFTERの現在のアドレスGR2から先頭アドレスのGR1を引く
 ST GR2,ALEN;上で求めた文字数を出力用文字列の文字数ALENに格納する
 OUT AFTER,ALEN;出力用の文字列AFTERを出力する

BEFORE DC '9L23OV6E81';元の文字列BEFORE
BLEN DC 10 ;元の文字列の文字数BLENを10文字とする
AFTER DS 20;出力用文字列AFTERの領域を20確保
ALEN DS 1;出力用の文字数AFTERの領域を1確保


 RPOP
 RET

 END

それでは実行して、シミュレーターを動かして1つずつトレースをしていきます。

GR1に、元の文字列BEFOREの先頭のアドレスが入ります。
(GR1とGR2の値は、実行環境によって異なりますので、増加の状態以外は気にしないで下さい)

GR2に出力する文字列AFTERの先頭のアドレスが入ります。

GR3に文字処理のカウント数ゼロが入ります。

GR3の0と元の配列の長さBLEN(=10)を比較し、GR3の方が小さいので、サインフラグSFがマイナスになります。

GR3はBLENと等しくないので、分岐はしません。

GR4に元の文字列BEFOREの最初の文字である’9’が入ります。
‘9’の文字コードは「0039」です。

GR4の文字’9’と’0’を比較します。
小さくないので、サインフラグはSFはそのままです。

そのため、分岐はしません。

次に、GR4の文字’9’と’9’が等しいか比較します。
等しいのでゼロフラグZFが立ちます。

JMIで9より小さい、JZEで9と等しい場合はSKIPに分岐します。
アセンブラでは他の言語みたいに「<=」で以下という表記はできない為、
以下ということは、「より小さい」と「等しい」の2つの処理に分割して記述しています。

この場合、’9’「以下」なのでJZEでSKIPに分岐して、出力するLOVEではないので、出力に関する処理を飛ばしています。

SKIPでは、元の文字列BEFOREを1つ先に進めます。

処理した文字数のGR3をインクリメントします。

ループに戻ります。

ループの先頭では、処理した文字数GR3の1と文字列BEFOREの長さBLENの10を比較します。

GR3の方が小さいので、SFのフラグが立ちました。
BLENと等しくないので、このままループを続けます。

GR4に、BEFOREの文字列 ‘L’ を取得します。
‘L’ の文字コードは「004C」です。

‘L’が’0’や’9’以下かどうか比較します。
小さくないのでSKIPに分岐せずに出力用文字列AFTERへの格納処理を行います。

GR4の文字’L’をAFTERに格納します。

AFTERを1つ先へ進めます。

と繰り返して行き、文字列処理カウントのGR3が9になる所まで飛ばして、そこからトレースします。



シミュレーターの値はこの様になっています。

GR4にBEFOREの最後の文字 ‘1’ が入りました。
‘1’ の文字コードは「0031」です。

GR4の’1’は’0’より大きいですが’9’より小さいので、SFフラグが立ってSKIPに分岐します。

元の文字列BEFOREを1つ進めます。

処理した文字数のGR3をインクリメントします。

ループに戻ります。

処理した文字数のGR3と文字数BLENの10を比較し、等しいのでゼロフラグZFが立ちます。

JZEよりFINに分岐して文字列を出力します。

元の文字列BEFOERを出力します。

出力用の文字列AFTERの先頭アドレスをGR1に入れます。

出力用の文字列の現在のアドレスGR2から先頭のアドレスGR1を引きます。
GR2にAFTERの文字数が4文字であることが求まります。

GR2の求めた文字数をAFTERの文字数ALENに格納します。

AFTERを出力します。

お疲れ様でした。
ここで一旦、写真で休憩を挟みます。

恵比寿ガーデンプレイスのシャンデリアです。
クリスマスイルミネーションで、フランスのクリスタルメーカー、バカラのものです。


ここから、復習&アウトプットタイムです!!
下記のコードをシミュレーターにコピペして、コメントを頼りに先ほどのコードを覚えているか入力して見て下さい。

上手く動いたら、値などを好きなように変えて動かして見て下さい。

この復習は学習直後は勿論、明日など少し日を開けて行うと、更に効果的です!!

このコードですと、出力する文字列をあなたの推しの名前にしてみたら、きっと楽しいですし、理解も深まると思います!

TEST START

 RPUSH
;GR1に元の文字列BEFOREの先頭アドレスを格納する
;GR2に出力用の文字列AFTERの先頭アドレスを格納する
;GR3に処理した文字数をカウントする

;<<ここからループ>>
;GR3のカウント数と元の文字列の長さBLENを比較する
;GR3のカウントが元の文字列の長さと等しかったらFINに分岐する
;GR4に元の文字列からGR1が指し示すアドレスに入っている文字を取得する
;GR4の文字と'0'(ゼロ)を比較する
;'0'より小さかったらSKIPへ分岐する
;GR4の文字と'9'を比較する
;'9'より小さかったらSKIPへ分岐する
;'9'と等しかったらSKIPへ分岐する

;出力すべき英字なので出力用の配列に格納する
;GR4の文字を出力用の文字列AFTERに格納する
;出力用の文字列AFTERを指し示すGR2を1つ先に進める


;数字・英字共通のSKIPラベル
;元の文字列BEFOREを1つ先に進める
;処理した文字数のカウント用のGR3をインクリメント
;ループへ戻る


;<<ループはここまで。>>

;ループを抜けた後の出力処理
;元の文字列を出力する
;GR1に出力用文字列AFTERの先頭アドレスを読み込む
;出力用文字列AFTERの現在のアドレスGR2から先頭アドレスのGR1を引く
;上で求めた文字数を出力用文字列の文字数ALENに格納する
;出力用の文字列AFTERを出力する

BEFORE DC '9L23OV6E81';元の文字列BEFORE
BLEN DC 10 ;元の文字列の文字数BLENを10文字とする
AFTER DS 20;出力用文字列AFTERの領域を20確保
ALEN DS 1;出力用の文字数AFTERの領域を1確保


 RPOP
 RET

 END

皆さま、大変お疲れ様でした。
この記事最後のブレイクタイムPhotoは・・・

恵比寿ガーデンプレイスのクリスマスイルミネーションです。

仕事や勉強のリフレッシュに、趣味で写真を撮っておりますので、宜しかったら フォトストック写真ACさん の投稿もご覧頂けますと、大変嬉しい限りでございます!!

こちら、無料の「ダウンロードユーザー」に登録して頂けると、無料で写真のダウンロードが可能になります。

※ 先にGoogleアカウントを作成して頂くと、登録が ラク です♪

写真素材素材【写真AC】

 

最後までご精読、誠にありがとうございました!!

自己紹介


アセンブラ自作サンプルとFE出題範囲のアリゴリズムへ

アセンブラ過去問プログラムへ


プログラミング未経験者はアセンブラと表計算どっち!?



基本情報技術者試験トップへ

午前免除試験

午後試験のオススメ本

スコアレポート

03アセンブラCASL2右シフトで、偶数は「北海道」、奇数は「沖縄」旅行!!

この記事ではアセンブラ言語で、偶数と奇数の判別について掲載しております。
ある数を右にシフトすると、偶数の場合はオーバーフローせず、奇数だったらオーバーフローするので、分岐により出力メッセージを分けます。
オーバーフローについては、

このシフトやオーバーフローについて、後ほど具体例を用いて詳しく説明致しますが、オーバーフローって何!?と気になった方は、こちらの外部記事が分かりやすいのでオススメです。(基本情報技術者試験では勿論、ITパスポート受験の際にもお世話になったサイトです。)

さて、行動制限も無くなって東京に住んでいる私は、アセンブラで偶数でしたら北海道に、奇数でしたら沖縄に旅行したい気分です♪

そんな、旅行気分が味わえるサブルーチンを作って見ました。

この記事では、こちらのWebのシミュレーターを使っています。
ダウンロードすることなく、素早くアセンブラの勉強が出来る、私が使った中で1番便利なシミュレーターです。

具体的には、GR1に設定された数が、
偶数の場合は「HOKKAIDO」
奇数の場合は「OKINAWA」
と出力します。

偶数は英語でEVEN、奇数はODDですので、それらをラベル名に使います。

偶数の例として、10進数の「4」は、2進数で(0100)、
奇数の例として、10進数の「7」は、2進数で(0111)を挙げます。

偶数を右にシフトすると、4でしたら「0100」→「0010」になって、
右に落っこちるのは、「0100」の一番下の桁である「0」ですよね。
つまり、オーバーフローしないです。

奇数を右にシフトすると、7でしたら「0111」→「0011」になって、
右に落っこちるのは、「0111」の一番下の桁である「1」ですよね。
つまり、オーバーフローします。

オーバーフローした時のジャンプ命令「JOV」を使って、出力する文字を分岐します。

まずは、偶数の例。

TEST START
 RPUSH

 LAD GR1,4;←GR1に数を指定

 SRL GR1,1;1ビット右へシフト
 JOV OVER;オーバーフローした場合はラベルOVERへジャンプ

 OUT EVEN,LEN;偶数の旅先「北海道」を出力
 JUMP FIN;ラベルFINへジャンプ

OVER OUT ODD,LEN2;奇数の旅先「沖縄」を出力

FIN RPOP;終了のFINラベル
 RET

EVEN DC 'HOKKAIDO';偶数ラベル
LEN DC 8;文字数

ODD DC 'OKINAWA';奇数ラベル
LEN2 DC 7;文字数

 END

4行目のところで、GR1に偶数の例として「4」を設定しています。

実行すると、GR1に4が入りました。


SRLで右シフトすると、GR1が2になりました。

10進数の「4」は2進数では「0100」なので、右に1ビットシフトすると「0010」になり、右に落っこちたのは「0」なのでオーバーフローせず、OFフラグは0です。

右側のコンソールでは、「HOKKAIDO」と出力されました。

シフトについての上記の説明が分かりにくかった場合、こちらの外部記事ではYouTubeによる動画の解説もありますので、気になった方はご覧下さい。

次にGR1に、奇数である7を設定した場合の例です。
4行目のGR1の値を偶数から奇数の「7」に設定した所以外は、同じコードです。

TEST START
 RPUSH

 LAD GR1,7;←GR1に数を指定

 SRL GR1,1;1ビット右へシフト
 JOV OVER;オーバーフローした場合はラベルOVERへジャンプ

 OUT EVEN,LEN;偶数の旅先「北海道」を出力
 JUMP FIN;ラベルFINへジャンプ

OVER OUT ODD,LEN2;奇数の旅先「沖縄」を出力

FIN RPOP;終了のFINラベル
 RET

EVEN DC 'HOKKAIDO';偶数ラベル
LEN DC 8;文字数

ODD DC 'OKINAWA';奇数ラベル
LEN2 DC 7;文字数

 END

実行すると、GR1に7が入りました。

右シフトすると、GR1が3になりました。
10進数「7」は2進数「0111」で、右シフトすると「0011」になって10進数の「3」になりました。

この時に、「0111」の一番下の桁の「1」が落っこちましたので、オーバーフローのフラフOFが1になりました。

オーバーフローをしたので、7行目のJOVの分岐で、12行目のラベルOVERにジャンプしました。

右側のコンソールには、「OKINAWA」が出力されました。

お疲れ様でした。
ここで一旦、写真で休憩を挟みます。


ここは、東京都立川市と日野市の境目の立日橋付近の多摩川土手で撮影した中央線です。

多摩川土手は、ランニングされている方も結構いらっしゃいました。

ここでは、通勤で良く見る電車と、特急や貨物列車も撮れました。
(2023年GWに撮影)


ここから、復習&アウトプットタイムです!!
下記のコードをシミュレーターにコピペして、コメントを頼りに先ほどのコードを覚えているか入力して見て下さい。

上手く動いたら、値などを好きなように変えて動かして見て下さい。

この復習は学習直後は勿論、明日など少し日を開けて行うと、更に効果的です!!

TEST START
 RPUSH

 ;←GR1に数を指定

 ;1ビット右へシフト
 ;オーバーフローした場合はラベルOVERへジャンプ

 ;偶数の旅先「北海道」を出力
 ;ラベルFINへジャンプ

;奇数の旅先「沖縄」を出力

FIN RPOP;終了のFINラベル
 RET

EVEN DC 'HOKKAIDO';偶数ラベル
LEN DC 8;文字数

ODD DC 'OKINAWA';奇数ラベル
LEN2 DC 7;文字数

 END

CASL2にはJOVやJUMP以外にも分岐命令があり、こちらの外部サイトがサンプル付きで分かりやすいです。

皆さま、大変お疲れ様でした。
この記事最後のブレイクタイムPhotoは・・・

多摩モノレールです。
JR立川から立川南まで徒歩で行き、柴崎体育館で下車。
日野方面に南下して撮影しました。

仕事や勉強のリフレッシュに、趣味で写真を撮っておりますので、宜しかったら フォトストック写真ACさん の投稿もご覧頂けますと、大変嬉しい限りでございます!!

こちら、無料の「ダウンロードユーザー」に登録して頂けると、無料で写真のダウンロードが可能になります。

※ 先にGoogleアカウントを作成して頂くと、登録が ラク です♪

写真素材素材【写真AC】

 

最後までご精読、誠にありがとうございました!!

自己紹介


アセンブラ自作サンプルとFE出題範囲のアリゴリズムへ

アセンブラ過去問プログラムへ


プログラミング未経験者はアセンブラと表計算どっち!?



基本情報技術者試験トップへ

午前免除試験

午後試験のオススメ本

スコアレポート

02アセンブラCASL2で「好きな食べ物」を入出力!

この記事では、アセンブラ言語であなたの好きな食べ物の文字列を使いながら、入出力命令のINとOUTが理解出来る自作サンプルを掲載しております。

例えば、「焼肉」と「食べたい」を入出力することによって、アセンブラに慣れて行きます。

DCとDSについてはこちらの外部記事が分かり易かったです。

この記事では、こちらのWebのシミュレーターを使っています。
ダウンロードすることなく、素早くアセンブラの勉強が出来る、私が使った中で1番便利なシミュレーターです。

早速、コードを見て行きます。

TEST START
 RPUSH

 IN FOOD,NUM ;好きな食べ物を入力

 OUT FOOD,NUM ;その食べ物を出力

 OUT MOJI,LEN ;文字列「食べたい」を出力



 RPOP
 RET

FOOD DS 30;食べ物FOODの格納場所を確保しておく
NUM DS 1;インプットボックスに入力した、文字数NUMの格納場所を確保しておく

MOJI DC 'TABETAI!!';文字列に「食べたい」を格納しておく
LEN DC 9;「食べたい!!」の文字数を格納しておく

 END

アセンブルして、実行して見ます。
今私は、ガッツリと焼肉が食べたい気分ですので、「YAKINIKU」と入力してEnterを押します。

OKを押します。

右側のコンソールに入力した内容が反映されます。
(このシミュレーターでは、INで入力した文字が反映される仕様になっている様です。
勿論後にOUT命令で出力します。)

更に実行を押していくと、OUT命令で出力されます。

最後に「食べたい!!」という文字列が出力されます。

焼肉、焼肉って、なんだかお腹が空いているみたいですね(笑)

お疲れ様でした。
ここで一旦、写真で休憩を挟みます。

いたばし花火大会2023


ここから、復習&アウトプットタイムです!!
下記のコードをシミュレーターにコピペして、コメントを頼りに先ほどのコードを覚えているか入力して見て下さい。

上手く動いたら、値などを好きなように変えて動かして見て下さい。

この復習は学習直後は勿論、明日など少し日を開けて行うと、更に効果的です!!

TEST START
 RPUSH

;好きな食べ物を入力

;その食べ物を出力

;文字列「食べたい」を出力



 RPOP
 RET

;食べ物FOODの格納場所を確保しておく
;INPUTBOXに入力した文字数NUMの格納場所を確保しておく

;文字列に「食べたい(TABETAI!!)」を格納しておく
;「食べたい」の文字数を格納しておく


 END

皆さま、大変お疲れ様でした。
この記事最後のブレイクタイムPhotoは・・・

今年2023年、4年ぶりの花火大会に行ってきました、いたばし花火大会の写真です。
高島平駅から北上して新河岸から撮影しました。

仕事や勉強のリフレッシュに、趣味で写真を撮っておりますので、宜しかったら フォトストック写真ACさん の投稿もご覧頂けますと、大変嬉しい限りでございます!!

こちら、無料の「ダウンロードユーザー」に登録して頂けると、無料で写真のダウンロードが可能になります。

※ 先にGoogleアカウントを作成して頂くと、登録が ラク です♪

写真素材素材【写真AC】

 

最後までご精読、誠にありがとうございました!!

自己紹介


アセンブラ自作サンプルとFE出題範囲のアリゴリズムへ

アセンブラ過去問プログラムへ


プログラミング未経験者はアセンブラと表計算どっち!?



基本情報技術者試験トップへ

午前免除試験

午後試験のオススメ本

スコアレポート