ベストアンサー MP-Z80(10進数の加算) 2010/11/19 00:27 助けてください!全く分かりません MP-Z80で10進数1から10まで加算し、その結果をAレジスタに格納し、A以外のレジスタの内容は保存されるようにするプログラムの作成を教えてください みんなの回答 (1) 専門家の回答 質問者が選んだベストアンサー ベストアンサー Mr_Holland ベストアンサー率56% (890/1576) 2010/11/19 03:34 回答No.1 EX AF,A'F' ; AF←→A'F' でFレジスタの内容を保存 EXX ; BC←→B'C',DE←→D'E', HL←→H'L' でB,C,D,E,H,Lレジスタの内容を一括保存 ; ここは PUSH BC でもいいが EXX の方がステート数が少なくて済む。 XOR A ; Aレジスタの内容をリセット。 LD A,0 でもいいが XOR A の方がプログラム・バイト数とステート数が少なくて済む。 LD B,0Ah ; Bレジスタに10進10を入力。 10進表記で LD B,10 としてもよい。 LOOP: ADD A,B ; A←A+B の加算 DEC B ; B←B-1 の減算。 演算の結果Bレジスタが0になればZフラグ=1。それ以外は Zフラグ=0 JR NZ,LOOP ; Zフラグが0(NZ=1)ならLOOPに戻る(相対ジャンプ)。 Zフラグが1(NZ=0)ならスルー。 EXX ; BC←→B'C',DE←→D'E', HL←→H'L' でB,C,D,E,H,Lレジスタの内容を一括保存 ; 2行目の EXX をPUSH BC としたときは POP BC に置き換える。 ※ 文字がずれて読みづらいときは 「テキスト・ドキュメント」などにコピー&ペースとして読み直してください。 使用している命令は若干異なりますが、このサイトが役に立つかもしれません。 http://www.infonet.co.jp/ueyama/ip/software/assembler.html 質問者 お礼 2010/11/24 12:09 ありがとうございます 広告を見て全文表示する ログインすると、全ての回答が全文表示されます。 通報する ありがとう 0 カテゴリ 学問・教育自然科学物理学 関連するQ&A マイクロプロセッサのZ80について学校で課題がでたのですが、 マイクロプロセッサのZ80について学校で課題がでたのですが、 5100H番地に50H、5101H番地に10Hをキー入力であらかじめ書き込む。 4200H番地に以下のプログラムを書く。 (1)5100H番地、5101H番地の内容をそれぞれB、Cレジスタに取り込んだ。 (2)AレジスタにBレジスタの内容を転送し、AレジスタとCレジスタを加算し、その結果を5200H番地に格納した。 (3)AレジスタにBレジスタの内容を転送し、AレジスタからCレジスタを減算し、その結果を5201H番地に格納した。 (4)モニタに戻した。 JP 2006H C30620 アセンブラプログラムーーーーー機械語 (1) LD A , (5100H)ーーーーー 3A0051 LD B , Aーーーーー 47 LD A , (5101H)ーーーーー 3A0151 LD C , A ーーーーー 4F (2)LD A , B ーーーーー 78 ADD A , C ーーーーー 81 LD (5200H) , A ーーーーー 320052 (3)LD A , Bーーーーー 78 SUB A , C ーーーーー 91 LD (5201H) , Aーーーーー 320132 (4)JP 2006H ーーーーー C30620 このプログラムコードの最適化(命令数の削減)を行え。 という課題がでました。どうすればよいかわかりません。どなたかおしえてください。 非常に限定された条件での8バイト加算 アセンブリプログラム上で16ビット同士を加算したいと考えています。 ただ、非常に条件が限定されていて、 【簡単な構成について】 ・レジスタは8ビットAレジスタ一つのみ ・8ビット演算器(ALU)は一つのみ ・条件コードはZフラグのみ(ただし、書き換わるのは命令7.、8.でのみ) 【使える命令】 1.Aレジスタに即値をロード 2.Aレジスタに指定アドレスのデータをロード 3.Aレジスタから指定アドレスにストア 4.無条件分岐 5.Aレジスタand即値=0ならば分岐 6.Aレジスタor即値=0ならば分岐 7.Aレジスタと即値のandをとって書き戻し 8.Aレジスタと即値のorをとって書き戻し 9.Aレジスタと即値を加算して書き戻し a.Aレジスタと指定アドレスのEORをとって書き戻し b.Aレジスタと指定アドレスのデータを加算して書き戻し c.間接アドレスのデータをAレジスタにロード d.Aレジスタの内容を間接アドレスにストア e.Aレジスタから即値を減算して書き戻し f.Aレジスタから指定アドレスデータを減算して書き戻し 普通に考えるならば、下位8ビット同士の加算、上位8ビット同士と下位8ビットのキャリーを加算すれば出来ます。 しかしながら、この限定された条件に於いてはなんらかの自由に使えるフラグ、もう少し汎用的に使える分岐命令が無ければ無理だと個人的には考えています。 出来るか、出来ないか、だけでも結構ですので、ご教授お願いします。 MP-Z80の問題について ワンボードマイコンMP-Z80のプログラムを勉強しているのですが、 次の問題がわかりません。 (1)NHKの時報の様な音を出すプログラムを作成する。但し音の周波数は、440Hzの音が鳴ったり鳴らなかったりを0.5秒間隔で3回繰り返して880Hzで1秒間鳴らすプログラムを作成する。プログラムは8900H番地以降に作成すること。周波数の誤差は+-0.5以下に、時間の誤差は+-1ms以下にすること。 お願いします、だれか教えてください。 天文学のお話。日本ではどのように考えられていた? OKWAVE コラム Z80に関しての宿題なのですが、 Z80に関しての宿題なのですが、 「コール命令を使った電子オルガン」 キーを入力したら対応する音が鳴るようにプログラミングする。(入力を 常に監視し、FFHでなかったらサウンド出力をする。)プログラムは4400H番地から書く。 キー入力:CALL 2018Hと呼ぶとAレジスタに押されたキーの内容が入ってくる。 押されないとFFHが入っている。(いずれかのキーが押されるとAレジスタには00Hから17Hまでの対応する値が格納される。) サウンド出力:Aレジスタに00Hから17Hを入力してCALL 201BHと呼ぶと対応する音が鳴る。 (1)キー入力を行った.Aレジスタにキーの内容が入る。 (2)AレジスタがFFHの場合は(1)に戻る。そうでないときは(3)へ行く。 (3)Aレジスタの内容により、サウンド出力を行った。 (4)(1)に戻る。 ニーモニック CALL , 2018H SUB FFH JP Z , (4400H) ・・・・(ゼロフラグZが1の時、4400番地にジャンプする。) ADD FFH CALL , 201BH JP 4400H ↑のようにすればよいのですが、なぜなのかいまいちわかりません。異なるコードで実装せよ。とのことなので理解したいです。おしえてください。 桁上げ保存加算器(2進数計算) 2進数の積で桁上げ保存加算器で求めよと出てきました。 たとえばA=15、B=23(もちろん10進数表記です)のとき 2進数で表すと、A=(1111)、B=(10111)となります。 桁上げ保存加算器で求めよというのは 10進数の積の方法と同様に下の方法で1111*10111を解けばいいのでしょうか? 1111 10111 ――― 1111 1111 1111 1111 ――――― 101011001=345 2進数の加算の繰り上がり 2進数の四則演算のプログラムを作りたいと思い、2進数を表示するところまではできたのですが、加算になると繰り上がりという壁にぶつかってしまいました。繰り上がりや桁上げなどがよく分からないので、お教えください。(下のソースコードが繰り上がりのない加算をするまでのものです) #include <stdio.h> int main(void) { int a,b,i,j,x[8],y[8],z[8]; do{ puts("二つの符号なし整数を入力してください。(ただしa>bとし、bはのべき乗の値とする)"); printf("a="); scanf("%d",&a); printf("b="); scanf("%d",&b); if(a < = b) puts("入力した値がa>bになっていません。\a"); }while(a < = b); for( i = 0; i < = 7; i + +){ x[i] = a % 2; a = a / 2; y[i] = b % 2; b = b / 2; } puts("aとbをそれぞれ二進数で表すと"); printf("a="); for( i = 7; i > = 0; i - -){ printf("%d",x[i]); } puts(""); printf("b="); for( i = 7; i > = 0; i - -){ printf("%d",y[i]); } printf("となります。\n\n"); printf("<加算>\n"); printf("c=a+b="); for( j = 7; j > = 0; j - -){ z[j]=x[j]^y[j]; printf("%d",z[j]); } return(0); } ワンボードマイコンMP-Z80を用いたプログラミング 今、ワンボードマイコンMP-Z80でプログラミングの勉強をしています。 まだ、基本的なところなんですが、次の問題がわかりません。 1)8100H番地から81FFH番地までの100Hバイト分のRAM領域を0とする プログラムを作成せよ。 2)1から10までの整数の和を求め、8100H番地に格納せよ。 3)8100H番地から810FH番地に格納されているデータを8ビットの符号付 絶対値表現とみなしたとき、各データを2の補数表現に変換し、8200H番地から格納せよ。 この三つの問題なんですが、1)は全部に0を入れるということでしょうか? これらの問題は繰り返し命令の範囲の問題なので、繰り返し命令を 使うそうです。ヒントだけでも教えてください。 素数の積に1を加算すると素数ですか? 誰か素数を順番に掛け算したものに対して1を加算すると素数になる理由を教えてください。 素数1*素数2*素数3*素数4*素数5,,,*素数n +1 = 素数と聞きました。 (2*3*5*7*11,,,,+1=素数) 別に素数a*素数b+ 1 =素数って訳でもないのに。。。 (3*5+1=16) なぜ素数の1番目から順に掛け算を行ったものに対して1を加算すると素数になるのでしょうか? 2進数の加算回路について こんばんわ。 2進数の加算回路を行う回路は、1ビット目(LSB)の加算に半加算器を使って、2ビット目以降の加算に全加算回路を用いることで実現できますよね?でもこの方法の場合、下位の桁から毛か上げが順次確定していくことによってビット数が大きくなればなるほど結果が算出されるまでの応答速度が遅くなってしまいます。それを克服するために、何か別の方法はないでしょうか?別の方法で回路を作ることは可能でしょうか。 ご指導お願いします。 Z80について Z80のアセンブリ言語の命令でAレジスタの値を反転させるにはCPL命令を使えばいいんですが、その命令以外の命令を使ってAの値を反転させるにはどうすればいいでしょうか? どんな命令を使えばよろしいでしょうか? z80について マイコンz80を使って、17H+09Hを16進加算とDAAを用いて10進加算を 行うプログラムをつくったのですが、この場合、 16進加算 20H 10進加算 26 となるのはわかるのですが、同じプログラムで、 「ABH+FFH」をやると 16進加算 AAH 10進加算 10 「EFH-44H」 16進加算 ABH 10進加算 45 となるんですが、この理屈がどうもわかりません。教えてください。 加算するとはどういうことですか? 加算するとはどういうことですか? 例えば、1111と1101を加算した場合の結果は どうなるのでしょうか? それから、普通C言語でLEDを光らせたい場合、0b11111111とかいうふうにプログラムを記述すると思うのですが、加算する場合どういうふうに プログラムを記述すればよいのでしょうか? 0b11111111+0b11110000とかやっても加算した値はでてきませんし。 初心者ですいません。 教えてください。 日本史の転換点?:赤穂浪士、池田屋事件、禁門の変に見る武士の忠義と正義 OKWAVE コラム 16進数から2進数への変換 「Aレジスタに一文字のアスキーコードがあり、これを以下のように二進数に変換してBレジスタに代入する」 Aレジスタ='0’のとき、Bレジスタ=00000000B Aレジスタ='A’のとき、Bレジスタ=00001010B この例題に苦戦してます。。 16進数を2進数に変換するアセンブリ言語を教えてください!! ワンボードマイコン Z80 ワンボードマイコンMP-Z80のプログラムを勉強しているのですが、 次の二つの問題がわかりません。 1)8100(H)番地~813F(H)番地に格納されているデータを 8200(H)番地以降にコピーせよ。 2)8100(H)番地から810F(H)番地に格納されているデータを8ビットの 符号付絶対値表現とみなしたとき、各データを2の補数表現に変換し、 8200(H)番地から格納せよ。 1)は LD HL,8100 LD DE,8200 LD A,40H LD BC,A LDI LDIR HALT でいいのでしょうか。2)はまったくわかりません。 お願いします。 VB.NETで16進数+16進数や16進数*nをやる方法 16進数の計算で困っております。 以下のようなプログラムを作ろうと思っています。 入力1: 元の数値:(16進数/型String/例「0000563A」) 入力2: 加算数値:(16進数/型String/例「000001F5」) 入力3: 加算倍率:(10進数/型Integer/例「3」) 結果 入力1+(入力2*入力3) (結果 16進数/型String/例 00005C19) このようなプログラムを打ちたいのですが、 String=入力1+入力2 とやると、当然ながら「000001F53」と、ただ文字列として追加された計算になってしまいます。 どうやって計算すればよいのでしょうか? サブルーチンでの加算 CASLIIの課題で、 主プログラムで、連続したN語の領域に格納されているデータの先頭番地をサブルーチンに渡し、サブルーチンでデータを加算し、主プログラムのANS番地に格納するプログラムを作成しなさい。 という問題が出ました。 サブルーチンでの加算法がよくわかりません。 どなたかご教示ください。 MAIN START LAD GR0,TBL ST GR0,PARA LAD GR1,1 LD GR0,N ST GR0,PARA,GR1 LAD GR1,PARA CALL SUBR ST GR0,ANS RET TBL DC 1,2,3,4,5,6,7,8,9,10 N DC 10 PARA DS 2 ANS DS 1 END STH命令 次の命令はどういう処理でしょうか。 STH 5,60(4,2) 5番レジスタの内容を、ベースレジスタ2にインデックスレジスタ4のデータを加算しさらに60バイト加算して求めた主記憶装置のアドレスに格納するのでしょうか。 60(4,2)は主記憶装置のアドレスですか? 時間の加算と初期値・加算値をクッキーに保存 WEB上で日程表を作成したいのですが日付・時刻の加算とクッキーに保存する方法が分かりませんので教えて下さい ┌──┬────┐ │値1 │加算値1 │ ├──┼────┤ │値2 │加算値2 │ ├──┼────┤ │値3 │加算値3 │ ├──┼────┤ │値4 │加算値4 │ ├──┼────┤ │値5 │加算値5 │ └──┴────┘ 上記の様な表をテーブルで作成します 値1はinputタグで任意の日時を入力(「2003/9/5 16:00」等) 加算値1以降はinputタグで任意の時間を入力(2時間の場合「2」等) 値2以降は計算結果を表示する 値1に「2003/9/5 16:00」と入力 加算値1に「2」と入力 値2は値1+24時間+加算値1=「2003/9/5 18:00」と表示される 値3は値2+24時間+加算値2=「2003/9/6 18:00」と表示される(加算値2は未入力) 値4は値3+24時間+加算値3=「2003/9/7 19:00」と表示される(加算値3は「1」入力) 以下同様 値1・加算値1以降のinputタグに入力した値をクッキーに保存する 仕様としては以上です 宜しくお願い致します 2進数から10進数へ変換 C言語で、2進数から10進数に変換するプログラムを作ろうと思っています。 手計算で行う場合は2進数の 下1桁目×1 下2桁目×2 下3桁目×4。。。と計算しています。 下○桁目を取り出す方法を考えているのですが、思いつきません。 3桁の2進数を変換するプログラム(とりあえず101を変換することを考えて・・・)を書いてみたのですが、101を考えすぎたためか上手くいきませんでした。 最終的には10進数でintの範囲内程度の2進数の変換ができるプログラムを書きたいと思っています。 アドバイスをお願いします。 ちなみに、考えてみたプログラムは以下の通りです。 101以外で上手く変換できませんね・・・ ここに貼り付けるのが恥ずかしいです。 #include <stdio.h> main() { int x ,i ,z[3]; scanf("%d",&x); z[0]=x/100*4; z[1]=(x/10-10)*2; z[2]=(x-110)*1; printf("%d",z[0]+z[1]+z[2]); return 0; } 加算回路・乗算回路・除算回路について教えてください<(_ _)> 四則演算回路実習装置(加算回路・乗算回路・除算回路)について質問です。 1.加算回路において、「A」加算器入力とADD加算器出力の結線は何のために行うのでしょうか? 2.乗算回路において、Mレジスタ入力とADD加算器入力の結線は何のために行うのでしょうか? 3.除算回路において、「A」累算器入力とMレジスタ出力の結線は何のために行うのでしょうか? この3つがわかりません((+_+)) 詳しい方がいましたら回答よろしくお願いいたします<m(__)m> 注目のQ&A 「You」や「I」が入った曲といえば? Part2 結婚について考えていない大学生の彼氏について 関東の方に聞きたいです 大阪万博について 駅の清涼飲料水自販機 不倫の慰謝料の請求について 新型コロナウイルスがもたらした功績について教えて 旧姓を使う理由。 回復メディアの保存方法 好きな人を諦める方法 小諸市(長野県)在住でスキーやスノボをする方の用具 カテゴリ 学問・教育 自然科学 理科(小学校・中学校)化学物理学科学生物学地学天文学・宇宙科学環境学・生態学その他(自然科学) カテゴリ一覧を見る OKWAVE コラム 突然のトラブル?プリンター・メール・LINE編 携帯料金を賢く見直す!格安SIMと端末選びのポイントは? 友達って必要?友情って何だろう 大震災時の現実とは?私たちができる備え 「結婚相談所は恥ずかしい」は時代遅れ!負け組の誤解と出会いの掴み方 あなたにピッタリな商品が見つかる! OKWAVE セレクト コスメ化粧品 化粧水・クレンジングなど 健康食品・サプリ コンブチャなど バス用品 入浴剤・アミノ酸シャンプーなど スマホアプリ マッチングアプリなど ヘアケア 白髪染めヘアカラーなど インターネット回線 プロバイダ、光回線など
お礼
ありがとうございます