私は高校で理論的に ASM 8086 を勉強しています。(つまり、ノートブックで ASM 8086 を勉強していて、コンピューターで実行したことがないということです)。
そして、私は理解していません-これを行うとどうなりますか:
MOV AL, F2h
ADD AL, 20h
コンピュータは何をしますか?(AL、AX、CF、ZF の値は?)
私がこれを行うとどうなりますか:
MOV AH,F2h
ADD AH,20h
ありがとうございました !!
MOV AL, F2h
値0xF2をAL(アキュムレータ)レジスタに配置します。
ADD AL, 20h
ALレジスタに含まれる値に値0x20を追加します。
ALは0xF2+0x20になります。ただし、ALは8ビットレジスタであるため、値は0x112ではなく0x12になります。
AHも8ビットレジスタなので、同じです。
完全な値を取得するには、16ビットのAXレジスタを使用する必要があります。
AXはAH(高)とAL(低)で構成されているため、高低部分に個別にアクセスできます。
----------------EAX ----------------
------- AX --------
|----------------|--------|--------|
| | AH | AL |
|----------------|--------|--------|
16 bits 8 bits 8 bits
また、 D86 (A86 に付属)を使用することをお勧めします。8086 命令を対話的に入力できるため、各命令の後にすべてのレジスタとフラグがどうなるかを確認できます。
このコード(他の人が指摘したように):
MOV AL, F2h
ADD AL, 20h
フラグと AL レジスタにのみ影響します。他の 8 ビット レジスタは影響を受けません (AH も)。AX は AH と AL で構成されているため変更されますが、AH が 42h の場合:
Code AL AH AX
MOV AL,F2h F2 42 42f2
ADD AL,20h 12 42 4212
その特定の操作の結果は、キャリー フラグとパリティ フラグを設定し、オーバーフロー、ゼロ、符号、および補助キャリー フラグをクリアします。
オーバーフロー フラグを設定する必要があると思われるかもしれませんが、オーバーフロー フラグは値を符号付きの値 (この場合は -14 と 32) として扱い、加算は符号付きの最大値 (127) を超えません。キャリー フラグは値を符号なし値 (242 および 32) として扱い、加算が最大符号なし値 (255 より大きい 242 + 32 = 274) を超えるため、キャリーが設定されます。
学校でASMを勉強していたとき、このプログラムを使いました。単純なasmプログラムをデバッグするのに大いに役立ちました。ソースコードをエディターに配置し、[デバッグ]をクリックして、レジスターで何が起こったかを段階的に確認するだけです。
私のasmは少し錆びていますが、最初の例では、ALは12時間保持し、キャリーはAHを1つ増やします。
このエミュレーターをダウンロードすると、コードの実行を段階的に監視したり、レジスターの値を調べたりすることができます。鉛筆と紙よりもはるかに楽しいです。