ワンボードマイコン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で質問しましょう!
似たような質問が見つかりました
- その他(プログラミング・Web制作) 機械語に詳しい方 2 2022/07/10 12:06
- 相続税・贈与税 不動産の相続についてですが 2 2023/05/04 11:33
- その他(車) 古い普通乗用車の更新終了しているナビを何とか使える方法はないものでしょうか? 5 2023/02/18 23:05
- Excel(エクセル) 【Excel】住所に郵便番号を付記する方法 3 2022/05/07 17:15
- C言語・C++・C# c言語の問題です 2 2023/07/21 10:51
- Excel(エクセル) 【VBA】指定フォルダに格納中のテキストファイルをエクセルで処理し結果のエクセルを新規フォルダに保存 1 2022/03/25 14:19
- 相続・譲渡・売却 登記済みの家屋を増改築した家屋が変更登録されてない場合の相続登記申請等について 4 2023/08/26 10:07
- 計算機科学 エクセルのデータの表すことについて 2 2023/03/05 20:49
- 相続・遺言 自筆遺言書における不動産の表示の仕方 2 2022/04/19 10:43
- Visual Basic(VBA) vbaについて 主に以下のような設定をしたいです。 Aブックの表の行数が20未満だったら Bブックの 1 2023/06/08 23:40
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ITパスポートの勉強をしていま...
-
Python... 環境設定 初心者です...
-
バッチファイルが保存されてい...
-
プログラミングサイトについて。
-
Google ColaboでGUI作成
-
このURLで広告を出しているのは...
-
IT業界より楽に稼げる業界って...
-
Fortran の定数表現について
-
https://youtube.com/shorts/bT...
-
AIの登場でプログラマーたちが...
-
符号誤り率の計算は例題でどの...
-
入力された文字列が、LD22000を...
-
プログラミング初心者です。 Wi...
-
プログラミングを教えたいです...
-
テキストファイルのファイル名...
-
40代後半でゼロからのプログラ...
-
正規表現 URL抽出「 [\\/\\b]{0...
-
過剰なオブジェクト指向脳から...
-
16x16のスプライトフォント
-
本格的なWebアプリを公開する時...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
0xffffとは?
-
エクセルVBAのIf,Then 構...
-
8ビットのデータの、先頭ビット...
-
情報科学の飽和演算、ラップア...
-
ビットシフトってどんな時使うの?
-
一般のソフトで画像を扱う場合...
-
文字参照は10進数と16進数では...
-
スロースキャンコンピュータ 加...
-
C言語で128bitの2進数のビット...
-
命令について
-
シーケンス制御についての質問...
-
03分22秒36のような時間の単位...
-
verilog 符号付加減算(最上位...
-
[VBS] 素早くローテート演算したい
-
CASLIIでかけ算
-
符号無し整数xを右にnビット回転
-
算術シフト演算が成り立つ理由...
-
PLC 命令について
-
二元対称無記憶通信路を実現す...
-
2の補数
おすすめ情報