2

次の操作の後に、どのさまざまなフラグ(キャリー、サイン、ゼロ、オーバーフロー)を設定する必要があるかを判断しようとしています。

mov ax, 7ff0h;       ax register is now 7ff0h

add al, 10h;         

アセンブリがこれをどのように処理するかについて私は混乱しています。を含むレジスタのal部分だけに追加しているのでf0hf0h + 10hを与え100hます。これはオーバーフローフラグを設定しますか?キャリーフラグ?ない?オーバーフローフラグが設定されると思いますが、プログラムがこれを検出し、ahレジスタをから7fhに自動的に変更80hしてフルaxレジスタを作成することも考えられます8000h8000hこれは理論的にはキャリーフラグを設定しませんが、全体の数が負になるため、代わりにサインフラグとオーバーフローフラグを設定します。誰かがこれがどのように処理されるか説明できますか?

ありがとう。

4

2 に答える 2

1

指示に関するIntelの取扱説明書からADD

ADD命令は整数加算を実行します。符号付き整数オペランドと符号なし整数オペランドの両方の結果を評価し、OFフラグとCFフラグを設定して、それぞれ符号付きまたは符号なしの結果のキャリー(オーバーフロー)を示します。SFフラグは、署名された結果の符号を示します。

デバッガーで簡単なテストを実行すると、CFフラグが設定され、ALを形成するビットのみが変更されていることがわかります。

.386
.MODEL FLAT

.STACK 1024

ExitProcess PROTO NEAR32 stdcall, dwExitCode:DWORD

.CODE
_start:
    XOR EAX,EAX
    MOV AX,7ff0h
    ADD AL,10h
    PUSH 0  ;EAX is now 0x00007F00
    CALL ExitProcess

PUBLIC _start
END
于 2013-02-21T12:45:16.373 に答える
1

私はdebugコマンド(x86 Windowsに付属)で少し遊んだことがあります:

-a 100
1A2F:0100 mov ax, 7ff0
1A2F:0103 add al, 10
1A2F:0105
-t =100 2

AX=7FF0  BX=0000  CX=0000  DX=0000  SP=FFEE  BP=0000  SI=0000  DI=0000
DS=1A2F  ES=1A2F  SS=1A2F  CS=1A2F  IP=0103   NV UP EI PL NZ NA PO NC
1A2F:0103 0410          ADD     AL,10

AX=7F00  BX=0000  CX=0000  DX=0000  SP=FFEE  BP=0000  SI=0000  DI=0000
DS=1A2F  ES=1A2F  SS=1A2F  CS=1A2F  IP=0105   NV UP EI PL ZR NA PE CY
1A2F:0105 0000          ADD     [BX+SI],AL                         DS:0000=CD
-

NV[オーバーフローなし]PL(正)CY[キャリー]

于 2013-02-21T13:05:30.330 に答える