在這裏,操作者被施加到型,我相信這是可以將它們應用到與圖元相關聯的標籤,從而產生相同的輸出。
陣列
對於數組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
在這種情況下,操作者用的標籤使用。
字符串
對於字符串,就足夠了回顧,字符串是字節的陣列。
結構
對於結構,這個概念類似於陣列: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
確定的聯合變量的長度等於在尖括號或花括號內定義的初始化符的數量 。 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。以下示例 說明了這些要點。
; 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
這有元編程的味道和它通常用於優化使用宏生成的代碼。