TYPE的定义?

时间:2017-09-14 18:48:43

标签: 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

TYPE在循环线内意味着什么:edi,TYPE数组? 它是我们在它替换的数组中使用的 TYPE 变量吗?

2 个答案:

答案 0 :(得分:6)

<强> TL; DR

TYPE返回数据结构(此类数组)的“表示”类型的大小(以字节为单位)。
SIZEOF返回数据结构的大小(以字节为单位) LENGTHOF返回数据结构中“元素”的数量。

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

下面给出了精确的含义。

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

有一个MASM 6.1 reference document here,我不知道它具有多大的权威性,但所有这些答案都是基于它的。

<强>基元

该文档将TYPE列为类似于SIZEOF

的运算符
  

SIZEOFTYPE运算符在应用于类型时,会返回该类型整数的大小。

     

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

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

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

<强>字符串

对于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

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

<强>记录

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

  

应用于记录名称的SIZEOFTYPE运算符返回使用的字节数   记录。 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