TL;
DR
TYPE
은 데이터 구조 (예 : 배열)의 "나타내는"유형의 크기 (바이트)를 반환합니다.
SIZEOF
은 데이터 구조의 크기 (바이트)를 반환합니다.
LENGTHOF
은 데이터 구조에서 "요소"의 수를 반환합니다.
이러한 연산자는 유형 (예 : BYTE
) 또는 라벨 (예 : TYPE myLabel
)에 적용 할 수 있습니다.
동일한 데이터 구조 (예 : 레코드)의 경우 결과가 다를 수 있습니다.
아래에서 정확한 의미가 주어집니다.
표현식에 대한 정보가 들어있는 바이트 비트 필드를 반환하기 위해 매크로에 사용할 수있는 비슷한 이름의 연산자 .TYPE
이 있습니다 (예 : 레지스터 이름 지정).
이것은 MSDN의 잘못 작성된 MASM 설명서에서 제공하는 것입니다.
MASM 6.1 reference document here이 있는데, 나는 그것이 얼마나 권위적인지 모르겠지만이 답변은 모두 그것에 기초합니다.
프리미티브
그 문서 SIZEOF
SIZEOF
및 TYPE
연산자 유사한 조작자하는 형에 적용될 때, 정수의 크기를 리턴로 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을 반환합니다. 다음 예제는 입니다. 레이블 및 유형의 연산자를 사용하는 경우
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"
; Record definition
; 9 bits stored in 2 bytes
RGBCOLOR RECORD red:3, green:3, blue:3
여기에 약간의 비대칭이있다. 이 메타 프로그래밍의 맛을 가지고 있으며,
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
일반적으로 매크로로 생성 된 코드를 최적화하는 데 사용됩니다.