2

これは単純でばかげているかもしれませんが、理解できないように見えるので、とにかく質問します。

簡単なコード スニペット:

 assume cs:code, ds:data
 data segment
    b dd 256
 data ends

 code segment
 start:
        mov ax,data
        mov ds,ax
        mov ax,word ptr b     -> the result of this operation will be ax:= 256 (100h)

        mov bx,word ptr b+1   -> while this is going to be bx:= 1

アドレスと関係があり、バイトか何かで移動していると思いますが、正確にはわかりません。本当に理解する必要があります。

前もって感謝します !

4

2 に答える 2

10

これ

mov ax,word ptr b

次のようにフォーマットすると理解しやすくなります。

mov ax, word ptr [b]

これは、アドレスの単語bを ax にコピーする効果があります。したがって、この

mov bx,word ptr b+1 

実際には

mov bx,word ptr [b+1]

アドレスの単語b+1を bx にコピーする効果があります。

dddword を割り当て、それに 256 を割り当てるように指示します。16 進数の 256 は として表され00000100hます。x86では下位00010000hバイトが下位アドレスに格納されるため (いわゆるリトル エンディアン) 、dword は次のようにメモリに割り当てられます。00h01h00h00h

メモリがレジスタに読み込まれると、下位バイトがレジスタ内の下位ビットを占めるようにバイト順が変更されます (「ナチュラル」、いわゆるビッグ エンディアン)。したがって00h01hメモリ0100h内はレジスタ内に変換され01h00hメモリ内はレジスタ内に変換さ0001hれます。

したがって、最初のものは( , )movから最初の 2 バイトを取得して==を作成し、2 番目のものは( , )から中間の 2 バイトを取得して==を作成します。b00h01hax0100hb01h00hbx0001h

于 2013-02-08T12:35:00.890 に答える
0

RAM の場所に即値を書き込みたい場合にのみ、バイト数を指定する必要があります。それ以外の場合、アセンブラはレジスタサイズを使用して、アクセスするバイト数を決定します。

MASM を使用して dword アクセスを使用する場合を除き、dword アクセスが必要な場合は、DWORD PTR の宣言も必要です。たとえば、EAX のコンテンツを RAM の場所に書き込むか、RAM の場所から Dword を EAX に読み取ります。他のすべての 32 ビット レジスタと同じです。

バイト、ワード、および/または dword アクセスで複数のアクセスが必要な場合は、define bytes(DB) 表記で名前付き RAM ロケーションを宣言する方が良いと思います。

b DB 0, 1, 0, 0

レジスタサイズはよく知られており、指定する必要はありません。

mov al, [b]
mov [b], al

mov bl, [b+1]
mov [b+1], bl

mov ax, [b]
mov [b], ax

mov bx, [b+1]
mov [b+1], bx

MASM を除く:

mov eax, dword ptr[b]
mov dword ptr[b], eax

即時値の使用:

mov byte ptr[b], 0
mov word ptr[b], 256
mov dword ptr[b], 256

ダーク

于 2014-01-07T10:43:57.980 に答える