TL;
DR
TYPE
は、データ構造(配列など)の「表現」型のサイズをバイト単位で返します。
SIZEOF
は、データ構造体のサイズをバイト単位で返します。
LENGTHOF
は、データ構造内の「要素」の数を返します。
これらの演算子は、タイプ(例:)またはラベル(例:TYPE myLabel
)のいずれかに適用できます。
結果は、同じデータ構造(レコードなど)で異なる場合があります。
以下に、正確な意味を示します。
同様の名前の演算子.TYPE
は、マクロで式に関する情報を含むバイトビットフィールドを返すために使用できることに注意してください(たとえば、レジスタに名前を付けます)。
これは、MSDNの記述されていないMASMのドキュメントによって示されています。
MASM 6.1 reference document hereがありますが、私はどれだけ権威あるのかわかりませんが、この回答はすべてそれに基づいています。
タイプに適用した場合、SIZEOF
とTYPE
オペレータSIZEOF
に類似演算子としてリストTYPE
を文書プリミティブ
、整数のサイズを返しますそのタイプの。
各データ型に関連付けられているサイズ属性は次のとおりです。
Data Type Bytes
BYTE, SBYTE 1
WORD, SWORD 2
DWORD, SDWORD 4
FWORD 6
QWORD 8
TBYTE 10
ここ
事業者がタイプに適用され、私は同じ出力が得られ、それはプリミティブに関連付けられたラベルにそれらを適用することは可能だと信じ。
配列配列について
SIZEOF
とTYPE
(及びLENGTHOF
)との差が明確になる:
LENGTHOF
オペレータは、アレイ内の要素の数を返します。 SIZEOF
演算子は、 を配列定義の初期化子が使用するバイト数で返します。 TYPE
は、配列の 要素のサイズを返します。この場合
array WORD 40 DUP (5)
larray EQU LENGTHOF array ; 40 elements
sarray EQU SIZEOF array ; 80 bytes
tarray EQU TYPE array ; 2 bytes per element
、オペレータは、ラベルで使用されている:以下の実施例は、これらの演算子を示します。
ストリングストリングの
、それは文字列はバイトの配列であることを想起すればよいです。
構造構造のため
が、コンセプトは、配列に似ていますSIZEOF
は、ラベルに関連付けられているすべての構造オブジェクトのサイズがありながらTYPE
は、構造体のサイズです(MASMは次のようなものを考えますmyLabel db 1, 2, 3
myLabel
に関連付けられた3バイト)であるとして:
SIZEOF
によって決定構造のサイズが最後のフィールドのオフセット、プラスされ、最後 フィールドのサイズ、適切な位置合わせのために必要なすべての詰め物。この場合
INFO STRUCT
buffer BYTE 100 DUP (?)
crlf BYTE 13, 10
query BYTE 'Filename: '
endmark BYTE 36
drives DISKDRIVES <0, 1, 1>
INFO ENDS
;One struct
info1 INFO { , , 'Dir' }
;Three structs for this label
lotsof INFO { , , 'file1', , {0,0,0} },
{ , , 'file2', , {0,0,1} },
{ , , 'file3', , {0,0,2} }
sinfo1 EQU SIZEOF info1 ; 116 = number of bytes in initializers
linfo1 EQU LENGTHOF info1 ; 1 = number of items
tinfo1 EQU TYPE info1 ; 116 = same as size
slotsof EQU SIZEOF lotsof ; 116 * 3 = number of bytes in initializers
llotsof EQU LENGTHOF lotsof ; 3 = number of items
tlotsof EQU TYPE lotsof ; 116 = same as size for structure
; of type INFO
、オペレータは、ラベルで使用されています。
労働組合労働組合のために
、非常に似たようなことが起こります。
SIZEOF
によって決定組合の大きさは最長フィールドのサイズに加えて必要なパディングです。
LENGTHOF
で指定された共用体変数の長さは、角括弧または中括弧の中で と定義された初期化子の数と同じです。 TYPE
は、最も長いフィールドのタイプを示す値を返します。この場合
DWB UNION
d DWORD ?
w WORD ?
b BYTE ?
DWB ENDS
num DWB {0FFFFh}
array DWB (100/SIZEOF DWB) DUP ({0})
snum EQU SIZEOF num ; = 4
lnum EQU LENGTHOF num ; = 1
tnum EQU TYPE num ; = 4
sarray EQU SIZEOF array ; = 100 (4*25)
larray EQU LENGTHOF array ; = 25
tarray EQU TYPE array ; = 4
、オペレータは、ラベルで使用されています。
レコード
レコードビットの個々のビットまたはグループがフィールド考慮したバイト、ワード、またはダブルワードです。 マニュアルから引用されますが、意図的に引用符としてフォーマットされていません。レコード名に適用
SIZEOF
とTYPE
演算子は レコードによって使用されるバイト数を返します。 SIZEOF
は、レコード変数が占めるバイト数を返します。レコード宣言にLENGTHOF
を使用することはできませんが、定義済みのレコード変数とともに使用することはできます。 LENGTHOF
は、レコードの配列内のレコード数を 、または単一のレコード変数に対して1を返します。次の例の は、これらの点を示しています。
; Record definition
; 9 bits stored in 2 bytes
RGBCOLOR RECORD red:3, green:3, blue:3
mov ax, RGBCOLOR ; Equivalent to "mov ax, 01FFh"
; mov ax, LENGTHOF RGBCOLOR ; Illegal since LENGTHOF can
; apply only to data label
mov ax, SIZEOF RGBCOLOR ; Equivalent to "mov ax, 2"
mov ax, TYPE RGBCOLOR ; Equivalent to "mov ax, 2"
; Record instance
; 8 bits stored in 1 byte
RGBCOLOR2 RECORD red:3, green:3, blue:2
rgb RGBCOLOR2 <1, 1, 1> ; Initialize to 00100101y
mov ax, RGBCOLOR2 ; Equivalent to "mov ax, 00FFh"
mov ax, LENGTHOF rgb ; Equivalent to "mov ax, 1"
mov ax, SIZEOF rgb ; Equivalent to "mov ax, 1"
mov ax, TYPE rgb ; Equivalent to "mov ax, 1"
ラベルとし、種類と演算子を使用している場合ここで少し非対称性があります。これは、メタプログラミングの味を持っており、
Bit Set If expression
0 References a code label
1 Is a memory variable or has a relocatable data label
2 Is an immediate value
3 Uses direct memory addressing
4 Is a register value
5 References no undefined symbols and is without error
6 Is relative to SS
7 References an external label
:マクロ
この演算子はOPATTR
の古いバージョンであり、次の内容のバイトを返すためのオペレータとして
.TYPE
通常はマクロで生成されたコードを最適化するために使用されます。