【ChatGPT無】ねぇねぇ、アセンブラって知っている？


　どうも、カーブミラーです。

　今回は、ChatGPTにアセンブラを書いてもらいます。

:::note info
本記事は、ChatGPT（無料版）で
行なっております。GPT4での確認
はできておりません。あしからず。
:::

　アセンブラって、なに？
　　って声が聞こえそうですねw

　低水準の
　　プログラミング言語です。

　エンジニアの
　　みなさんが、
　　　お使いのプログラミング言語
　　　　C/C++、JAVA、Pythonは、
　　　　　高級言語と
　　　　　　呼ばれています。

　それに対しての、
　　低水準のプログラミング言語。

　それには、CPUが理解できる
　　機械語（又はマシン語）と
　　　アセンブリ言語があります。

　高級言語の多くは、
　　コンパイルという変換作業を
　　　しますが、これで
　　　　吐き出されるのが、
　　　　　低水準言語の
　　　　　　アセンブリ言語や
　　　　　　　機械語なのです。
***
　私は、ふと思ったのですよ。
　　ChatGPTさんは、
　　　“アセンブラを
　　　　書けるのかなぁ？”と。

　だって、
　　古い高級言語を扱えるのに、
　　　低水準言語が扱えない
　　　　わけがない！と

　いや、
　　扱えなくても、
　　　文句は言いませんし、
　　　　使おうとも思いませんしw

　それで、
　　ChatGPTさんに、
　　　聞いたら「書けるよ」って
　　　　言うのですよ。

　そりゃ、
　　やってもらいますよw

　といことで、どうぞ。
***
**User**
あなたは、6502のアセンブラを書けますか？

**ChatGPT**
はい、私は6502のアセンブラコードを書くことができます。どのようなプログラムを作成したいのでしょうか？お手伝いできることがあれば教えてください。




**User**
1から9までを加算して、答えを出すプログラム

**ChatGPT**
6502アセンブラで1から9までの整数を加算するプログラムを作成することができます。以下は簡単な例です：

```assembly
        .org $0600   ; プログラムの開始アドレスを設定

        LDX #1       ; Xレジスタに最初の数値1をロード
        LDY #0       ; Yレジスタに合計を格納するための0をロード
        STY $30      ; メモリアドレス$30に0を格納

Loop    INX          ; Xレジスタをインクリメント
        ADC $30,X     ; X番地の値を合計に加える
        STY $30,X     ; 合計をX番地に保存
        CPX #9        ; Xが9に達したかどうかをチェック
        BCC Loop      ; まだ9に達していない場合はループを続ける

        ; ここで合計が結果としてX番地に格納されています

Halt    BRK          ; プログラムの終了

        .end
```

このプログラムは、Xレジスタを使用して1から9までの整数を順番に合計し、その結果をX番地に格納します。プログラムの開始アドレスは$0600ですが、必要に応じて変更できます。このコードは6502アセンブラ用のものであり、適切な環境でアセンブルおよび実行する必要があります。
***
　見て、わかるでしょうか？

　Loopが、goto文のラベルです。
　LDXとか、LDYの三文字が、
　　CPU6502の命令語です。

　ChatGPTさんに
　　この命令語についても
　　　尋ねました。
***
**ChatGPT**
6502プロセッサのアセンブリ言語には多くの命令があります。以下は一部の主要な命令の一覧です。これには演算、条件分岐、メモリアクセス、スタック操作などが含まれます。

1. **LDA** - ロード・アキュムレータ（Load Accumulator）
2. **LDX** - ロード・Xレジスタ（Load X Register）
3. **LDY** - ロード・Yレジスタ（Load Y Register）
4. **STA** - ストア・アキュムレータ（Store Accumulator）
5. **STX** - ストア・Xレジスタ（Store X Register）
6. **STY** - ストア・Yレジスタ（Store Y Register）
7. **TAX** - 転送・アキュムレータからXレジスタへ（Transfer Accumulator to X）
8. **TAY** - 転送・アキュムレータからYレジスタへ（Transfer Accumulator to Y）
9. **TXA** - 転送・Xレジスタからアキュムレータへ（Transfer X to Accumulator）
10. **TYA** - 転送・Yレジスタからアキュムレータへ（Transfer Y to Accumulator）
11. **INX** - インクリメント・Xレジスタ（Increment X Register）
12. **INY** - インクリメント・Yレジスタ（Increment Y Register）
13. **DEX** - デクリメント・Xレジスタ（Decrement X Register）
14. **DEY** - デクリメント・Yレジスタ（Decrement Y Register）
15. **ADC** - アキュムレータに加算（Add with Carry）
16. **SBC** - アキュムレータから減算（Subtract with Carry）
17. **CMP** - 比較（Compare）
18. **CPX** - Xレジスタとの比較（Compare with X）
19. **CPY** - Yレジスタとの比較（Compare with Y）
20. **AND** - ビット単位の論理積（Logical AND）
21. **ORA** - ビット単位の論理和（Logical OR）
22. **EOR** - ビット単位の排他的論理和（Exclusive OR）
23. **ASL** - 算術左シフト（Arithmetic Shift Left）
24. **LSR** - 論理右シフト（Logical Shift Right）
25. **ROL** - 左ローテート（Rotate Left）
26. **ROR** - 右ローテート（Rotate Right）
27. **BIT** - ビットテスト（Bit Test）
28. **BRK** - 割り込みブレーク（Break）
29. **BCC** - キャリークリア時の分岐（Branch on Carry Clear）
30. **BCS** - キャリーセット時の分岐（Branch on Carry Set）
31. **BEQ** - ゼロフラグセット時の分岐（Branch on Equal）
32. **BMI** - マイナスフラグセット時の分岐（Branch on Minus）
33. **BNE** - ゼロフラグクリア時の分岐（Branch on Not Equal）
34. **BPL** - マイナスフラグクリア時の分岐（Branch on Plus）
35. **BVC** - オーバーフローフラグクリア時の分岐（Branch on Overflow Clear）
36. **BVS** - オーバーフローフラグセット時の分岐（Branch on Overflow Set）
37. **JMP** - ジャンプ（Jump）
38. **JSR** - サブルーチンコール（Jump to Subroutine）
39. **RTS** - サブルーチンリターン（Return from Subroutine）
40. **NOP** - ノーオペレーション（No Operation）

これは6502プロセッサの一部の命令です。6502アセンブリ言語ではこれらの命令を組み合わせてプログラムを記述します。それぞれの命令は特定の操作を実行し、プロセッサの状態を変更します。
***
　ちなみに、
　　ここで例に出している
　　　6502というCPUは、
　　　　以下のコンピューターで
　　　　　使われたそうです。
***
**ChatGPT**
6502プロセッサは、1970年代から1980年代にかけて広く使用された8ビットのマイクロプロセッサです。このプロセッサは、多くの初期のパーソナルコンピュータやホビーパソコンに搭載され、コンピュータ革命の一翼を担いました。以下は6502プロセッサが使われた一部のコンピュータおよびプラットフォームの例です：

1. **Commodore PET**: 1977年に発売されたCommodore社の初のパーソナルコンピュータで、6502プロセッサを搭載していました。

2. **Apple II**: 1977年にAppleがリリースしたパーソナルコンピュータで、初期モデルには6502プロセッサが使用されていました。

3. **Atari 2600**: 1977年に発売されたAtariのゲームコンソールで、6502プロセッサを搭載していました。

4. **Nintendo Entertainment System (NES)**: 1983年に発売された任天堂のゲームコンソールで、6502系列の2A03 CPUを搭載していました。

5. **BBC Micro**: BBCが1981年にリリースした教育向けコンピュータで、6502プロセッサを採用していました。

6. **Acorn Electron**: 1983年に発売されたコンピュータで、BBC Microの低価格版であり、6502プロセッサを搭載していました。

7. **Commodore 64 (C64)**: 1982年に発売され、史上最も成功した8ビットコンピュータの1つで、6502系列のCPU（6510）を使用していました。

これらは6502プロセッサが広く使用された一部のプラットフォームですが、他にも多くのコンピュータやシステムで使用されました。6502は当時のコンピュータ業界において非常に影響力のあるプロセッサの1つでした。
***
　ご存知のものは、
　　ありましたか？

　せいぜい、
　　Apple IIでしょうか。

　Apple社創業時に、ジョブズらが
　　ガレージで、家内生産
　　　したものです。

　（調べたら、
　　　Apple IIの前身の
　　　　Apple Iでした）

　すごい数（50台）の注文を受け、
　　一週間後に納入するために
　　　頑張ったそうです。
　　　　（期間はあやふや）

　設計は、共同創業者の
　　ウォズニアック氏です。

　2023年3月28日に、
　　強力なAI開発を最低でも
　　　6カ月間直ちに停止するように
　　　　呼びかける公開書簡に
　　　　　サインしていましたね。

　ちなみに、
　　「4. **Nintendo Entertainment System (NES)**」
　　　ですが、
　　　　ファミリーコンピューター、
　　　　　ファミコンのことです。
　　　　　　海外では、NESと
　　　　　　　呼ばれたらしい。

　6502は、
　　今からは考えられないほど、
　　　低能力のCPUですが、
　　　　安価で手に入れやすかった
　　　　　そうです。

　※ Appleや6502については、
　　古い書籍からの知識です。
　　　タイトル不明です。
***
　最後に。

　まさか、ChatGPTさんが
　　アセンブリ言語も
　　　守備範囲にしていたとは
　　　　思いませんでした。

　使い道としては、
　　シングルボードコンピュータの
　　　アセンブラコードを
　　　　ChatGPTさんに
　　　　　書いてもらう
　　　　　　感じでしょうか。

　シングルボードコンピュータは、
　　IoTやロボットなどに組み込む
　　　小型のコンピューターてす。

　Linuxを載せて、
　　パソコンにするような
　　　タイプもあります。

　ググったら、
　　いくつか、
　　　ChatGPTさんを使って、
　　　　やっている方がいました。

　世の中には、
　　そういうシステムを
　　　組んでいる人もいるのですね。

　ロボットを
　　作りたい自分としては、
　　　羨ましい限りです。
　　　　手が出ないんですけどねw

　以上。
***
　今日（2023/09/09）、
　　@fujitanozomu様からの
　　　ご指摘がありました。

　ChatGPTらしいポカみたいで、
　　修正してくださいました。

　詳しくは、
　　コメント欄をご覧ください。

　@fujitanozomu様、
　　ありがとうございます。