1

(a * (bc) * d) を計算するアセンブリ プログラムを作成する必要があります。ここで、a、b、c、d は符号付き 8 ビット形式でデータ セグメントに格納される変数です。(結果は符号付き 32 ビット数値として表されると想定する必要があります)

私は次のコードを書きました

data segment

    a db 1
    b db 9
    c db 3
    d db 4 

    x dw ?


ends

stack segment
    dw   128  dup(0)
ends

code segment
start:

    mov ax, data
    mov ds, ax
    mov es, ax


    ; what would the difference be in the following three lines if the variables where signed?
    mov al, b
    sub al,c
    mul a
    mul d


    ;treating result as a 16bit - how about signed?
    mov x,ax 





    mov ax, 4c00h ; exit to operating system.
    int 21h    
ends

end start

私の質問は次のとおりです。レジストリのサイズ (al,ah,bh,bl, ecc... 8bit), (ax,bx,cd, dx、16 ビット)?

DW変数に格納する以外に、32ビット変数を16ビット変数とは異なる方法で扱うにはどうすればよいですか?

便宜上、コードの関連部分に上記の質問の短いバージョンを書きました。

誰か助けてくれませんか?お時間をいただきありがとうございます。

4

1 に答える 1

3

一般に、レジスタ/メモリの内容はビットの (特定の長さの) シーケンスであり、符号付き/符号なしの概念は関係ありません。

演算子を署名済みと見なすか署名なしと見なすかが重要な命令がいくつかあります。いくつかの例は次のとおりです。

  • 乗算:MUL符号なしオペランドと符号付きオペランドに使用IMULします。
  • 除算:DIV符号なしオペランドと符号付きオペランドに使用IDIVします。
  • 条件付きジャンプ: JA(符号なし) 上記の場合のジャンプを意味し、(符号付きJG) より大きい場合のジャンプを意味します。JBは、(符号なし) 以下の場合にジャンプすることを意味し、(符号付き) 以下の場合にジャンプすることをJL意味します。

;treating result as a 16bit - how about signed?
mov x,ax 

MOVソースから宛先にビットをコピーするだけです。知っておく必要があるのは、コピーするビット数 (つまり、オペランドのサイズ) だけです。

1 つの例外は、 widening を使用している場合ですMOV

movzx ax,byte ptr [foo]  ; zero-extend the byte foo into ax (for unsigned numbers)
movsx ax,byte ptr [foo]  ; sign-extend the byte foo into ax (for signed numbers)

DW 変数に格納する以外に、32 ビット変数を 16 変数とは異なる方法で扱うにはどうすればよいですか?

DW16ビット変数用です。32 ビット変数の場合は、DD.

于 2013-09-24T15:07:50.380 に答える