您好,欢迎访问三七文档
当前位置:首页 > 临时分类 > IBM汇编语言教程lec14
1第14回文字列操作のプログラミング演習(2)今日の到達目標1.メモリ内容の2進数表示(インデックス修飾,シフト命令,OUT命令)2.メモリ内容の16進数表示(サブルーチン,文字への変換,インデックス修飾,OUT命令)3.数字列から2進数への変換(インデックス修飾,数値の生成、IN命令)できるだけヒントを見ずにやってみよう2課題14-1メモリ内容の2進数表示(1)このプログラムをworke1.casという名前で作成せよ。(2)このプログラムをシミュレーション実行し,ラベルDATAで確保された語の内容が2進数表示されることを確認せよ。ラベルDATAで確保された語に1個の数値が格納されている。この数値を16ビットの2進数として,'0'と'1'からなる16文字の文字列に変換し,出力装置に出力するプログラムを作成せよ。例えば,ラベルDATAで確保された語の内容が2000(#07D0)であったとき,文字列'0000011111010000'が出力される。できるだけヒントを見ずにやってみようファイル名worke1.cas3メモリ内容の2進数表示フローチャートOF=1?数値データのロードWORKE1NO初期設定(指標=0等)出力領域に'0'を格納データを左に1ビット論理シフト指標を+1RETURNYES文字列を出力ヒント:16語からなる出力領域(OBUF)を用意しておき,データを左に1ビット論理シフトした時のオーバーフローフラグOFの値に応じて,文字'0’か文字'1’を出力領域に格納する操作を16回繰り返す。最後にOUT命令によって出力領域を出力する。出力領域に'1'を格納指標<16?NOYESヒント:初期設定として,文字'0’と文字'1’をレジスタに用意しておくとよい。LDGR6,='0'LDGR7,='1'出力文字数(OLEN)は16で固定4課題14-2メモリ内容の16進数表示(1)次ページのヒントを参考にして,入力された1文字を2桁の16進数に変換して出力するプログラムをworke2.casという名前で作成する。(2)このプログラムをシミュレーション実行し,入力した文字が正しく16進数に変換されて表示されることを確認せよ。GR0の下位4ビットの数値を16進数の1文字に変換し,GR1の下位8ビットに入れて返すサブルーチンCONVSTを作成せよ。次に,ラベルDATAで確保された語に格納されている数値を,上記のサブルーチンCONVSTを4回用いて、4桁の16進数表記に変換し,出力装置に出力するプログラムを作成せよ。なお、文字コードは教科書の216ページ、もしくは第2回資料の19ページを参考にしてよい。例えば、DATAで宣言された語の内容が3000(#0BB8)であった時、’0BB8’という4文字が出力される。ファイル名worke2.cas5メモリ内容の16進数表示概略フローチャートGR0←DATAWORKE24桁の16進数を出力RETURNGR1の内容を出力領域へ格納指標の初期設定(初期値:3)4ビットの数値を16進数の1文字へ変換するサブルーチンCONVST・入力:GR0の下位4ビット(その他のビットは無視)・出力:GR1の下位8ビット(上位8ビットはゼロ)CONVSTGR1←GR0GR1←GR1AND#000FGR110?GR1←GR1+'0'RETURNYESNOGR1←GR1-10+'A'※'9'と'A'のコード間にはギャップがあるコード文字数値#46'F'1111………#41'A'1010#39'9'1001………#30'0'0000CALLCOVSTGR0を右に4ビット論理シフト指標≧0?YESNO指標を-1出力する文字を格納するための4語の領域(OBUF)を確保しておき、下位(右側)の桁から順番にCONVSTを用いて出力文字に変換し、この領域に格納する(逆順となることに注意)※サブルーチンの中でGR0を壊さぬこと6課題14-3数字列から2進数への変換(1)次ページのヒントを参考にして,このプログラムをworke3.casという名前で作成する。尚,10倍の計算はシフト命令を用いておこなうとよい。(2)このプログラムをシミュレーション実行し,数字の文字列’245’を入力した時,ラベルDATAで確保された語の内容が245(#00F5),数字の文字列’12345’を入力した時,ラベルDATAで確保された語の内容が12345(#3039)となることを確認せよ。※さらに余裕のある人は数字列の最初に’-’(マイナス)を許して、負数も変換できるプログラムを作成してみると良い。入力装置から数字列(10進数と考える)を読み込み,これを数値に変換して,ラベルDATAで確保された語に格納するプログラムを作成せよ。但し,入力される数字列は’1’~’32767’とする。ファイル名worke3.cas7数字列から2進数への変換アルゴリズム245文字コード:#0032#0034#0035↓↓数値化(#000FとANDを取る)↓数値:245現在値(初期値0)を10倍して,読みこんだ数値と加算→次の現在値現在値(0)*10+2→2現在値(2)*10+4→24現在値(24)*10+5→245入力文字列8入力領域から1文字取り出す→GR2数値化:#000FとANDを取るGR0:現在値(初期値0),GR1:入力領域用指標(初期値0)数字列から2進数への変換フローチャート数字列の入力WORKE3YES初期設定RETURN最終文字?YESNOGR0をDATAへ格納1文字の取り出し数値化(入力値)現在値を10倍現在値と入力値を加算GR0-GR0+GR2GR0-GR0*10指標(GR1)を+1し、その値がILENの内容と一致したか※10倍の計算はシフト命令を用いておこなう9発展課題2進数から数字列への変換(1)次ページのヒントを参考にして,このプログラムをworke4.casという名前で作成する。尚,除算は次々ページに示す除算サブルーチンDIVを利用すると良い。(2)このプログラムをシミュレーション実行し,ラベルDATAで確保された語の値が正しく出力されることを確認せよ。ラベルDATAで確保された語に格納されている2進数を数字の文字列に変換し,出力装置に出力するプログラムを作成せよ。但し,この2進数は1~32767とし、出力する文字列の上位(左側)に無意味なゼロがある場合は、これをスペース(’’)に変換して出力する。例えば、ラベルDATAで確保された語の内容が30000(#7530)であれば、’30000’を、300(#012C)であれば、’300’を出力する。ファイル名worke4.cas102進数から数字列への変換アルゴリズム現在値を定数(10000,1000,100,10,1)で割り,商と余りを求める商は文字化して出力する余りは次の現在値となる初期値(245)÷10000→余り245,商0→#0020現在値(245)÷1000→余り245,商0→#0020現在値(245)÷100→余り45,商2→#0032現在値(45)÷10→余り5,商4→#0034現在値(5)÷1→余り0,商5→#0035出力文字列□□245※最初に現れる0はスペースに変換する※数値の文字化:#0030とORを取る;除算サブルーチンDIV;入力:GR1(被除数),GR2(除数);出力:GR1(商),GR2(余り)※GR3は不変DIVSTARTPUSH0,GR3;GR2をプッシュLDGR3,GR2;GR3-除数LDGR2,GR1;GR2-被除数LADGR1,-1;商を-1にセット;D1LADGR1,1,GR1;商をインクリメントSUBAGR2,GR3;被乗数から除数を引くJPLD1;引けなくなるまで引くJZED1;D2ADDAGR2,GR3;引きすぎたので,被除数に除数を加えるPOPGR3;GR3をポップRETEND11除算サブルーチンDIV除算サブルーチンを利用して,データを定数で割っていく被除数:GR1,除数:GR2商:GR1,余り:GR2125個の定数(10000,1000,100,10,1)を連続領域に用意しておき,データをこれらの値で順次割っていくことで,各桁の値を求める始めに出てくる商0はスペース(’’)を出力する。一旦,文字化し始めたら0も文字化するGR3:定数領域用の指標(初期値0)GR7:文字生成フラグ(初期値0)2進数から数字列への変換フローチャートGR2←DATAWORKE4NO初期設定RETURN商=0?フラグ=0?YESYESNO除数GR2←定数領域から定数を1個取り出すGR1を出力領域に格納指標(GR3)を+1指標<5?CALLDIV被除数GR1←GR2YESNOGR1←’’GR1←GR1or#0030フラグ(GR7)←1数字列を出力数値の文字化出力領域として5語確保し、出力文字数は5で固定
本文标题:IBM汇编语言教程lec14
链接地址:https://www.777doc.com/doc-2876705 .html