0

必要なもの

書いてほしいプログラムの一部を追加しました。問題は、バイトを定義し、それらを単語(符号付き拡張子)に変換し、後で追加するように要求されることです。

問題

追加しても、目的の出力が得られないことがあります。たとえば、私は次のものを使用しています。

data segment
    first     DB    183
    second    DB    94
data ends

code segment
start:

    mov ax,data
    mov ds,ax

    mov AX, 0
    mov AL, first
    cbw

    mov BX, AX
    mov AX, 0

    mov AL, second
    cbw

    add AX, BX

    mov ax, 4c00h
    int 21h

code ends
end start

94 ( 16 進数の 5E ) + 183 ( 16 進数の B7 ) = 277 ( 16 進数の 115 ) ですが、最初cbwAX = B7ではなくFFB7です。ただし、2 番目の数値は予想どおりAX = 5Eのままであるため、2 つの結果を加算するとAX = 15 with CF = 1になります。

CBW に関するこのページを見つけました。「AL の符号ビット (ビット 7) が設定されている場合、この命令は AH を 0FFh に設定します」と記載されています。B7 はバイナリで1011 0111であるためです。

何か不足していますか?キャリーフラグを何らかの方法で解釈する必要がありますか? 115 (hex)を取得できないのはなぜですか?

前もって感謝します。

4

2 に答える 2

2

94 (16 進数の 5E) + 183 (16 進数の B7) = 277 (16 進数の 115) ですが、最初の cbw のため、AX = B7 ではなく FFB7 です。ただし、2 番目の数値は予想どおり AX = 5E のままであるため、2 つの結果を加算すると、CF = 1 で AX = 15 になります。なぜ 115 (16 進数) が得られないのですか?

結果は、値を符号付きと見なすか、符号なしと見なすかによって異なります。

符号付きの場合、上位バイトを下位バイトの最上位ビットで埋める必要があります。これは、MOVSX命令 (例: MOVSX AX,AL) またはCBW(CBWオペランドが in の場合にのみ機能) で実行できますAL

ワードに符号拡張されたバイトは( )0xB7と等しくなります。したがって、期待される結果はです。-730xFFB794 - 73 = 21 (0x15)


unsigned の場合、上位バイトをクリアする必要があります。これは、MOVZX命令を使用MOVZX AX,ALするか (例: )、上位バイトとそれ自体を XOR: することで実行できます (例: XOR AH,AH)。

ワードにゼロ拡張されたバイトは( )0xB7と等しくなります。したがって、期待される結果はです。1830x00B794 + 183 = 277 (0x115)

于 2013-10-27T12:49:23.423 に答える
0

代わりにcbwゼロ拡張 move を使用できますmovzx AX, AL

命令ALを使用する場合、バイトをレジスタに格納する必要はありません。movzx最適なコードは次のようになります。

mov AL, first
movzx AX, AL

mov BL, second
movzx BX, BL

add AX, BX

編集でメモリ変数を使用する可能性を利用してコードをさらに最適化するという彼の提案について、Jester に感謝しますmovzx

movzx AX,byte ptr [first]
movzx BX,byte ptr [second]
add AX, BX
于 2013-10-26T19:11:31.740 に答える