web-dev-qa-db-ja.com

x86アセンブリで使用する変数サイズ(db、dw、dd)

私はアセンブリーの初心者であり、db、dw、ddなどのすべての意味がわかりません。 1 + 1を実行し、変数に保存して結果を表示するこの小さなスクリプトを作成しようとしました。ここに私のコードがあります:

.386
.model flat, stdcall 
option casemap :none
include \masm32\include\windows.inc
include \masm32\include\kernel32.inc
include \masm32\include\masm32.inc
includelib \masm32\lib\kernel32.lib
includelib \masm32\lib\masm32.lib
.data
num db ? ; set variable . Here is where I don't know what data type to use.
.code
start:
mov eax, 1               ; add 1 to eax register
mov ebx, 1               ; add 1 to ebx register
add eax, ebx             ; add registers eax and ebx
Push eax                 ; Push eax into the stack
pop num                  ; pop eax into the variable num (when I tried it, it gave me an error, i think  thats because of the data type)
invoke StdOut, addr num  ; display num on the console.
invoke ExitProcess       ; exit
end start

Db、dw、ddの意味と、それらが変数の設定と結合にどのように影響するか、そしてそのようなことを理解する必要があります。

事前に感謝、Progrmr

58
Progrmr

簡単なレビュー、

  • DB-バイトを定義します。 8ビット
  • DW-Wordを定義します。一般的なx86 32ビットシステムでは通常2バイト
  • DD-ダブルワードを定義します。一般的なx86 32ビットシステムでは通常4バイト

x86 Assembly tutorial から、

ポップ命令は、ハードウェアでサポートされているスタックの最上部から4バイトのデータ要素を指定されたオペランド(つまり、レジスタまたはメモリの場所)に削除します。最初にメモリロケーション[SP]にある4バイトを指定されたレジスタまたはメモリロケーションに移動し、SPを4ずつインクリメントします。

Numは1バイトです。 DDで宣言して、4バイトになり、popセマンティクスと一致するようにしてください。

77
Pavan Manjunath

完全なリストは次のとおりです。

DB、DW、DD、DQ、DT、DDQ、およびDO(出力ファイルで初期化されたデータを宣言するために使用されます。)

参照: http://www.tortall.net/projects/yasm/manual/html/nasm-pseudop.html

これらは、さまざまな方法で呼び出すことができます(注:Visual-Studioの場合、「0x」構文の代わりに「h」を使用します-例:0x55ではなく55h):

    db      0x55                ; just the byte 0x55
    db      0x55,0x56,0x57      ; three bytes in succession
    db      'a',0x55            ; character constants are OK
    db      'hello',13,10,'$'   ; so are string constants
    dw      0x1234              ; 0x34 0x12
    dw      'A'                 ; 0x41 0x00 (it's just a number)
    dw      'AB'                ; 0x41 0x42 (character constant)
    dw      'ABC'               ; 0x41 0x42 0x43 0x00 (string)
    dd      0x12345678          ; 0x78 0x56 0x34 0x12
    dq      0x1122334455667788  ; 0x88 0x77 0x66 0x55 0x44 0x33 0x22 0x11
    ddq     0x112233445566778899aabbccddeeff00
    ; 0x00 0xff 0xee 0xdd 0xcc 0xbb 0xaa 0x99
    ; 0x88 0x77 0x66 0x55 0x44 0x33 0x22 0x11
    do     0x112233445566778899aabbccddeeff00 ; same as previous
    dd      1.234567e20         ; floating-point constant
    dq      1.234567e20         ; double-precision float
    dt      1.234567e20         ; extended-precision float

DTはオペランドとして数値定数を受け入れず、DDQはオペランドとして浮動小数点定数を受け入れません。 DDより大きいサイズは、オペランドとして文字列を受け入れません。

27
cnd