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数组? 它是我们在它替换的数组中使用的 TYPE 变量吗?
答案 0 :(得分:6)
<强> TL; DR 强>
TYPE
返回数据结构(此类数组)的“表示”类型的大小(以字节为单位)。
SIZEOF
返回数据结构的大小(以字节为单位)
LENGTHOF
返回数据结构中“元素”的数量。
请注意,这些运算符既可以应用于类型(例如BYTE
),也可以应用于标签(例如TYPE myLabel
)。
对于相同的数据结构(例如记录),结果可能不同。
下面给出了精确的含义。
请注意,类似命名的运算符.TYPE
可以在宏中用于返回包含表达式信息的字节位域(例如,它命名寄存器)。
这是MSDN中编写得不好的MASM文档所呈现的内容。
有一个MASM 6.1 reference document here,我不知道它具有多大的权威性,但所有这些答案都是基于它的。
<强>基元强>
该文档将TYPE
列为类似于SIZEOF
SIZEOF
和TYPE
运算符在应用于类型时,会返回该类型整数的大小。与每种数据类型关联的size属性为:
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
在这种情况下,运算符与标签一起使用。
<强>字符串强>
对于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
在这种情况下,运算符与标签一起使用。
<强>联盟强>
对于工会,会发生类似的事情:
由
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
在这种情况下,运算符与标签一起使用。
<强>记录强>
记录是字节,字或双字,其中各个位或位组被视为字段。 引自手册,但未故意将其格式化为引用。
应用于记录名称的
SIZEOF
和TYPE
运算符返回使用的字节数 记录。SIZEOF
返回记录变量占用的字节数。你无法使用LENGTHOF
带有记录声明,但您可以将它与定义的记录变量一起使用。LENGTHOF
返回 记录数组中的记录数,或单个记录变量的记录数。以下示例 说明了这些要点。
; 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"
当使用带有标签和类型的运算符时,这里有一点不对称。
.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
这有元编程的味道,它通常用于优化用宏生成的代码。
答案 1 :(得分:0)
这是TYPE operator,它将返回与其一起使用的表达式的类型(在这种特殊情况下,array
)
供进一步参考:MASM operators