TYPE的定义?

Muh*_*ved 0 assembly masm masm32

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
Run Code Online (Sandbox Code Playgroud)

TYPE在循环线内的含义是什么:edi,TYPE数组?它是我们在它替换的数组中使用的变量类型吗?

Mar*_*oom 6

TL; DR

TYPE返回数据结构(例如数组)的"表示"类型的大小(以字节为单位).
SIZEOF返回数据结构的大小(以字节为单位).
LENGTHOF返回数据结构中"元素"的数量.

请注意,这些运算符既可以应用于类型(例如BYTE),也可以应用于标签(例如TYPE myLabel).
对于相同的数据结构(例如记录),结果可能不同.

下面给出了精确的含义.

注意,.TYPE可以在宏中使用类似命名的运算符来返回包含表达式信息的字节位域(例如,它命名寄存器).
这是MSDN中编写得不​​好的MASM文档所呈现的内容.

这里有一个MASM 6.1参考文档,我不知道它有多大权威,但所有这些答案都是基于它的.


基元

该文档TYPE列为类似的运算符SIZEOF

SIZEOFTYPE运营商,当应用于类型,则返回该类型的一个整数的大小.

与每种数据类型关联的size属性是:

Data Type       Bytes
  BYTE, SBYTE     1
  WORD, SWORD     2
  DWORD, SDWORD   4
  FWORD           6
  QWORD           8
  TBYTE           10
Run Code Online (Sandbox Code Playgroud)

这里运算符应用于一个类型,我相信可以将它们应用于与基元相关联的标签,从而产生相同的输出.

数组

对于数组,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
Run Code Online (Sandbox Code Playgroud)

在这种情况下,运算符与标签一起使用.

字符串

对于String,只需回忆一下Strings是字节数组.

结构

对于Structures,概念类似于数组':TYPE是结构SIZEOF的大小,而是与标签关联的所有结构对象的大小(MASM认为是与myLabel db 1, 2, 3三个字节关联的东西myLabel):

确定的结构大小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
Run Code Online (Sandbox Code Playgroud)

在这种情况下,运算符与标签一起使用.

工会

对于工会,会发生类似的事情:

SIZEOF所确定的并集的大小是最长字段的大小加上所需的任何填充.
LENGTHOF等于在尖括号或花括号内定义的初始值设定项的数量确定的union变量的长度.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
Run Code Online (Sandbox Code Playgroud)

在这种情况下,运算符与标签一起使用.

记录

记录是字节,字或双字,其中各个位或位组被认为是字段. 引自手册,但未故意格式化为引用.

SIZEOFTYPE应用,达到创纪录的名称运算符返回的记录使用的字节数.SIZEOF返回记录变量占用的字节数.您不能使用LENGTHOF 记录声明,但可以将其与定义的记录变量一起使用.LENGTHOF返回记录数组中的记录数,或单个记录变量的记录数.以下示例说明了这些要点.

; Record definition
; 9 bits stored in 2 bytes
RGBCOLOR RECORD red:3, green:3, blue:3
Run Code Online (Sandbox Code Playgroud)
 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" 
Run Code Online (Sandbox Code Playgroud)

在使用带有标签和类型的运算符时,这里存在一些不对称性.


.TYPE 作为宏的运算符

此运算符是旧版本,OPATTR并返回包含以下内容的字节:

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
Run Code Online (Sandbox Code Playgroud)

这有元编程的味道,它通常用于优化用宏生成的代码.