2017-09-14 21 views
0
INCLUDE Irvine32.inc 
.data 
array DWORD 10,20,30,40,50 
sum DWORD 0 

.code 
main PROC 

mov EDI,offset array 
mov ECX,5 
mov EAX,0 
HERE: 

add eax,[edi] 
add edi,TYPE array 
dec ecx 
jnz HERE 

mov sum,eax 

exit 
main ENDP 
END main 

루프 라인에서 TYPE은 무엇을 의미합니까? edi, TYPE array? 대체하는 배열에서 사용중인 변수의 TYPE입니까?TYPE의 정의?

답변

6

TL;

DR

TYPE은 데이터 구조 (예 : 배열)의 "나타내는"유형의 크기 (바이트)를 반환합니다.
SIZEOF은 데이터 구조의 크기 (바이트)를 반환합니다.
LENGTHOF은 데이터 구조에서 "요소"의 수를 반환합니다.

이러한 연산자는 유형 (예 : BYTE) 또는 라벨 (예 : TYPE myLabel)에 적용 할 수 있습니다.
동일한 데이터 구조 (예 : 레코드)의 경우 결과가 다를 수 있습니다.

아래에서 정확한 의미가 주어집니다.

표현식에 대한 정보가 들어있는 바이트 비트 필드를 반환하기 위해 매크로에 사용할 수있는 비슷한 이름의 연산자 .TYPE이 있습니다 (예 : 레지스터 이름 지정).
이것은 MSDN의 잘못 작성된 MASM 설명서에서 제공하는 것입니다.

MASM 6.1 reference document here이 있는데, 나는 그것이 얼마나 권위적인지 모르겠지만이 답변은 모두 그것에 기초합니다.


프리미티브

그 문서 SIZEOF

SIZEOFTYPE 연산자 유사한 조작자하는 에 적용될 때, 정수의 크기를 리턴로 TYPE 나열 그 유형의.

각 데이터 유형과 연관된 크기 속성은 다음과 같습니다

Data Type  Bytes 
    BYTE, SBYTE  1 
    WORD, SWORD  2 
    DWORD, SDWORD 4 
    FWORD   6 
    QWORD   8 
    TBYTE   10 
다음

연산자 유형에 적용되는, 나는 동일한 출력 결과는 원시와 관련된 라벨에 적용하는 것이 가능하다고 믿습니다 .

어레이 배열 용

SIZEOFTYPE (및 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, 3myLabel와 연관된 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 

은 연산자 레이블로 사용됩니다.

기록

기록 바이트, 워드, 또는 비트들의 개별 비트 또는 필드 그룹이 고려 된 더블 워드이다. 설명서에서 인용되었지만 의도적으로 견적 형식으로 표시되지 않았습니다.기록 이름에 적용

SIZEOFTYPE 연산자는 기록에서 사용하는 바이트 수를 반환합니다. 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

일반적으로 매크로로 생성 된 코드를 최적화하는 데 사용됩니다.