2017-09-14 138 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 

是什麼類型平均環線內:EDI,類型的數組? 難道是類型的變量我們用它取代數組中?TYPE的定義?

回答

6

TL; DR

TYPE以字節爲單位返回數據結構(如數組)的「表示」類型的大小。
SIZEOF返回大小,以字節爲單位的數據結構的。
LENGTHOF返回在數據結構中的「元素」的數量。

請注意,這些運算符可以應用於類型(例如​​)或標籤(例如TYPE myLabel)。
對於相同的數據結構(例如記錄),結果可能不同。

確切含義在下面給出製成。

請注意,有類似命名的運算符.TYPE可用於宏以返回包含有關表達式信息(例如,它命名一個寄存器)的字節位域。
這是由MSDN中寫得不好的MASM文檔提供的。

有一個MASM 6.1 reference document here,我不知道有多少權威性的,但所有這個答案是基於它。


基元

即文檔列出TYPE類似於SIZEOF

SIZEOFTYPE運營商操作,當施加到一個類型,返回一個整數的大小這種類型。

與每個數據類型相關的大小的屬性是:

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 

在這種情況下,操作者用的標籤使用。

字符串

對於字符串,就足夠了回顧,字符串是字節的陣列。

結構

對於結構,這個概念類似於陣列: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 

在這種情況下,操作者使用具有標籤。

記錄

記錄是字節,字,或在其中的位的各個位或基團被認爲是雙字字段。 從手冊引用,但沒有故意格式化爲引用。

SIZEOFTYPE運營商施加到記錄名稱返回由 記錄中使用的字節數。 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 

這有元編程的味道和它通常用於優化使用宏生成的代碼。

相關問題