ワンボードマイコン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)はまったくわかりません。
お願いします。
A 回答 (8件)
- 最新から表示
- 回答順に表示
No.8
- 回答日時:
回答者の方は今までのやりとりでもうほとんど解を得ていると思うのですが、なんか楽しそうなので一言。
nda23さんのCPI命令の使い方はシブいですね。私もZ80は30年選手ですが初めて見たかも。
私ならここは
LD HL,8100H
LD DE,8200H
LD B,16
LOOP:
LD A,(HL)
; ここで符号付き絶対値から2の補数表現に変換(後述)
LD (DE),A
INC HL
INC DE
DJNZ LOOP
HALT
とします。INC HL, INC DEで(オリジナルZ80なら)6クロック×2、DJNZは14クロック(13かも)で合計26(25)クロック、CPIとJP PEの組み合わせだと16+10で同じく26クロックですがDJNZを使うのだとCレジスタが空きます。データ量が256バイト以内と少ないならこちらのほうが素直かと思いました。
符号付き絶対値から2の補数表現への変換ですけれど、これはTacosanさんのが良さそうですね。
あるいは、ちゃんと考えてないのでしくじっているかもしれませんがこんな方法ではどうですか。
符号付き絶対値というのは、ある値の2の補数表現をAとして
A (A=0~127)
128-A (A=-0~-127)
ですから、(HL)に符号付き絶対値が入っているとして
LD A,(HL)
RLCA
SBC A,A ; (HL)が正だったとき0, 負だったとき255(0FFH)が入る
LD C,A
AND 7FH ; (HL)が正だったとき0、負だったとき127(7FH)
ADD A,(HL) ; (HL)が正だったとき(HL)、負だったとき(HL)+127
XOR C ; (HL)が正だったとき(HL)、負だったとき255-((HL)+127) = 128-(HL)
というコードはどうでしょう。オリジナルZ80で37クロック、8バイト、分岐なしです。レジスタを一個使いますし、速くもないからイマイチですか。
もう一ひねりできるとマシなコードになりそうですけれど。
(Tacosanさんのは値が正の時27クロックで済みますし、負の時でも37クロックで8バイトですね。LD A,(HL)のところから数えて。)
No.7
- 回答日時:
>JP NZ,LOOP ;BC≠0ならLOOPへ分岐
>ではだめでしょうか
ダメです。
CPIは INC HL、INC、DEC BC とすべきところを横着して、1命令で
やっているのです。比較結果を云々するためではありません。
最後の DEC BC の結果、BC=0だとP/VがEvenになり、そうでなければOddになります。
それを条件に分岐するのです。命令(ニモニック)の意味が書かれている参考書をお持ちでしょ?
そういうの無しで、プログラムできませんし、勉強にもなりませんよ。
No.6
- 回答日時:
A に符号付き絶対値表現が入っているとして, これを 2の補数に直すなら
BIT 7, A
JR Z, isPositive
NEG
XOR A, 80H
isPositive:
になる... のかな? フラグ変化が今一つわからん....
No.5
- 回答日時:
(1)LDIRの動作は知っているんでしょ?
だったら、正直にやればいいと思うんですけど。
LD HL,8100H ;HL←8100H 転送元データのアドレス
LD DE,8200H ;DE←8200H 転送先データのアドレス
LD BC,0040H ;BC←0040H 転送バイト数
LDIR ;(DE++)←(HL++)×BCが示す回数
(2)少しひねった問題だけど、同じでしょう。
LD HL,8100H
LD DE,8200H
LD BC,0010H
LOOP:
LD A,(HL) ;A←(HL) HLの示すアドレスからAに代入
NEG ;A←Aの「2の補数」
LD (DE),A ;(DE)←A DEの示すアドレスへAを格納
CPI ;HL++,DE++,BC--
JP PE,LOOP ;BC≠0ならLOOPへ分岐
間接アドレス指定が理解できないと苦労します。というか、ここが
コンピュータプログラムのセンスなんですが、これは勉強しても
なかなか身に着かない。(だから個人的センスなんですが…)
もし、どうしようもなく理解できない時は、アドレス感覚の無い
言語(Java、Basic、COBOL等)を勉強すべきです。
私の30年以上の経験から言いますと、世にSEですと威張っている人で
間接アドレス指定の何たるかが分かっている人は3割くらいです。
回答ありがとうございます。
最後の
JP PE,LOOP ;BC≠0ならLOOPへ分岐
は
JP NZ,LOOP ;BC≠0ならLOOPへ分岐
ではだめでしょうか?
No.4
- 回答日時:
(1)
LD HL, 8100H
LD DE, 8200H
LD BC, 0040H
LDIR
(2)
LD HL, 8100H ; src
LD DE, 8200H ; dst
LD B, 10H ; counter
LD C, FFH ; ビット反転用
LOOP:
LD A, (HL) ; srcから
XOR C ; ビット反転して1加えると2の補数
INC A
LD (DE), A ; dstへ
INC HL
INC DE
DJNZ LOOP ; Bレジスタの数だけ繰り返し
でいいと思います。
確認できる環境がないので未検証ですが。
No.2
- 回答日時:
2の補数というのは、例えばどんなときに使うかという一例をあげますと・・・
引き算命令がないような小規模マイコン減算をするときや、マイコン無しで減算器を作ったりするときは・・・
引く数を2の補数にして、引かれる数に加算する。
とか、します。
論理演算の否定論理とか分かりますか?
論理演算とか2の補数の解説は、電子技術の文部検定教科書なんかにも書いてあります。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・人生のプチ美学を教えてください!!
- ・10秒目をつむったら…
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・【大喜利】【投稿~9/18】 おとぎ話『桃太郎』の知られざるエピソード
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Web初心者です。 簡易的なWebペ...
-
pythonでAmazonのほしいものリ...
-
Google ColaboでGUI作成
-
AIの登場でプログラマーたちが...
-
プログラマーと学歴の関係性に...
-
プログラマーは誘惑にさらされ...
-
python エラー
-
プログラミング言語について
-
Processingについて
-
プログラマーに向いている人の...
-
16x16のスプライトフォント
-
vba クリップボードクリアにつ...
-
python の 連鎖代入の文法
-
Pythonでの文字列からfloatへの...
-
・オブジェクト指向のメリット...
-
プログラミングの雑談がしたい...
-
最新のプログラム言語を学ぶに...
-
フォルダを自動作成・移動を複...
-
このURLで広告を出しているのは...
-
Google Colabでimport soxが出...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
0xffffとは?
-
8ビットのデータの、先頭ビット...
-
エクセルVBAのIf,Then 構...
-
A4 持ち込み
-
ビットシフトってどんな時使うの?
-
一般のソフトで画像を扱う場合...
-
文字参照は10進数と16進数では...
-
符号無し整数xを右にnビット回転
-
C言語で128bitの2進数のビット...
-
シーケンス制御についての質問...
-
PLC 命令について
-
命令について
-
Python: 数値を反転させたい
-
情報科学の飽和演算、ラップア...
-
1の補数
-
03分22秒36のような時間の単位...
-
ビット立つの意味
-
verilog 符号付加減算(最上位...
-
上位ビットと下位ビットの入れかえ
-
シーケンス制御について質問で...
おすすめ情報