私を常に混乱させてきたのは、8 ビット コンピュータが 256 バイトを超える RAM にアクセスする方法です。2 つのレジスタを使用する必要があることはわかっていますが、これがアセンブリ コードでどのようになるかを示す例を教えてください。
お気に入り:
mov a, [x] ???
私を常に混乱させてきたのは、8 ビット コンピュータが 256 バイトを超える RAM にアクセスする方法です。2 つのレジスタを使用する必要があることはわかっていますが、これがアセンブリ コードでどのようになるかを示す例を教えてください。
お気に入り:
mov a, [x] ???
レジスタ L と H にアドレスの LOWER と HIGHER 8 ビットの半分があるとします。たとえば、アドレス 32770 dec = 8002 hex からバイトを読み取りたいとします。
mov l, 02h ;lower byte of address
mov h, 80h ;higher byte of address
mov a, [hl] ;a <-- [h*256 + l]
CPU には多くのアドレッシング モードが存在します。したがって、別の例を使用できます。たとえば、単一のレジスタと即値アドレスのみを使用できます。
mov h, 80h
mov a, [2] ;a <-- [h*256 + immediate]
それは常に特定の CPU アーキテクチャに依存します。たとえば、Zilog Z80 は 8 ビット CPU と呼ばれますが、多くの 16 ビット命令も含まれています。次のように、インデックス付きアドレス指定を行うことができます。
mov ix, 8002h ;base address of an array
mov a,[ix+20] ;a <-- [ix + 20] i.e. read a byte from an array like ix[20] in C
注意: これらの古い 8 ビット CPU は 8 ビット アキュムレータを使用します。つまり、8 ビット レジスタでのみ数学やその他の算術演算を計算できるため、ソフトウェア計算レベルでは 8 ビットです。また、それらのメモリ アクセス ユニットは 8 ビットです。つまり、一度に 1 バイトのメモリしか読み書きできないため、ハードウェア レベルでも 8 ビットです。これらの 16 ビット命令は低速で、実際には 8 ビット操作のペアを連続して実行します。
Intel 8080 は、間接アドレス用の 2 つのレジスタ H と L を備えた 8 ビット CPU で、16 ビットのメモリをアドレス指定できます。16 ビットの 8086 には、セグメント化された 20 ビットのアドレスがあります。80286 は 24 ビット アドレスを使用し、上位 16 ビット セグメントはセグメント記述子のテーブルへのインデックスです。32 ビット x86 は、PAE で 36 ビット アドレスを使用します...
PICマイクロコントローラーは、レジスターに8ビットの値を持ち、PCの上位ビット(または覚えていない専用アドレスレジスター)とマージして、13ビットアドレスを形成します(またはそれ以上、アーキテクチャによって異なります)
マイクロコントローラ (一部のマイクロプロセッサ アーキテクチャ) でのもう 1 つの一般的な方法は、バンキングです。この方法では、CPU が毎回確認できる「メモリ ウィンドウ」を変更します。
詳細については、ここで読むことができます
8080 (Z80 など) を考えてみましょう。これには 8 ビット レジスタがありましたが、レジスタをペアにして 16 ビット レジスタのように動作させることができました。おそらく最もよく使用されたペアは HL で、アドレスの上位 8 ビットが H で、下位 8 ビットが L でした。他のレジスタ ペアは BC と DE でした。繰り返しますが、ほとんどの命令は一度にペアの 1 つのレジスタだけで動作しますが、ペアを一緒に使用して 16 ビット量を処理できる命令もいくつかあります (たとえば、少なくともメモリが機能する場合、 HL に DE を追加するものもありました)。
一部の命令では、16 ビット アドレスを直接使用することもできます。
jmp 01234h
6502 も同じようなものでしたが、RAM の最初の 256 バイト (別名「ページ 0」) での作業に一部の命令が制限されていました。後のバージョン (65816?) では、ページ 0 として扱われるさまざまな物理アドレスの選択がサポートされていました。