6

私を常に混乱させてきたのは、8 ビット コンピュータが 256 バイトを超える RAM にアクセスする方法です。2 つのレジスタを使用する必要があることはわかっていますが、これがアセンブリ コードでどのようになるかを示す例を教えてください。

お気に入り:

mov a, [x]   ???
4

4 に答える 4

7

レジスタ 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 ビット操作のペアを連続して実行します。

于 2012-12-02T23:12:44.253 に答える
4

これを達成するための多くのテクニックがあります

Intel 8080 は、間接アドレス用の 2 つのレジスタ H と L を備えた 8 ビット CPU で、16 ビットのメモリをアドレス指定できます。16 ビットの 8086 には、セグメント化された 20 ビットのアドレスがあります。80286 は 24 ビット アドレスを使用し、上位 16 ビット セグメントはセグメント記述子のテーブルへのインデックスです。32 ビット x86 は、PAE で 36 ビット アドレスを使用します...

PICマイクロコントローラーは、レジスターに8ビットの値を持ち、PCの上位ビット(または覚えていない専用アドレスレジスター)とマージして、13ビットアドレスを形成します(またはそれ以上、アーキテクチャによって異なります)

マイクロコントローラ (一部のマイクロプロセッサ アーキテクチャ) でのもう 1 つの一般的な方法は、バンキングです。この方法では、CPU が毎回確認できる「メモリ ウィンドウ」を変更します。

  • Intel 8051 には 4 つのレジスタ バンクがあり、共通のレジスタ バンクは常に表示され、残りはバンク切り替え命令によって選択できます。一部のバージョンでは、コード アドレスにバンキングを使用して、2MB のコードに拡張できます。
  • DOS は、EMSおよびXMSでメモリ バンキングを使用して、1MB または RAM を超えるアクセスを行うために、上位メモリを下位アドレスにマップします。
  • 32 ビット Windows は、PAE モードでAddress Windowing Extensionsを使用して、32 ビット プロセスが 2 GB を超える RAM にアクセスできるようにします。

詳細については、ここで読むことができます

于 2014-01-27T15:48:41.197 に答える
4

8080 (Z80 など) を考えてみましょう。これには 8 ビット レジスタがありましたが、レジスタをペアにして 16 ビット レジスタのように動作させることができました。おそらく最もよく使用されたペアは HL で、アドレスの上位 8 ビットが H で、下位 8 ビットが L でした。他のレジスタ ペアは BC と DE でした。繰り返しますが、ほとんどの命令は一度にペアの 1 つのレジスタだけで動作しますが、ペアを一緒に使用して 16 ビット量を処理できる命令もいくつかあります (たとえば、少なくともメモリが機能する場合、 HL に DE を追加するものもありました)。

一部の命令では、16 ビット アドレスを直接使用することもできます。

jmp 01234h

6502 も同じようなものでしたが、RAM の最初の 256 バイト (別名「ページ 0」) での作業に一部の命令が制限されていました。後のバージョン (65816?) では、ページ 0 として扱われるさまざまな物理アドレスの選択がサポートされていました。

于 2012-12-02T23:09:55.717 に答える