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

ループライン内でTYPEとは何を意味しますか?edi、TYPE配列? 置き換えられる配列で使用している変数のTYPEですか?TYPEの定義は?

答えて

0

これは、それが一緒に使用される式の型を返すだろうTYPE operator、(この特定の場合において、array)さらに参考のために

ある:MASM operators

6

TL;

DR

TYPEは、データ構造(配列など)の「表現」型のサイズをバイト単位で返します。
SIZEOFは、データ構造体のサイズをバイト単位で返します。
LENGTHOFは、データ構造内の「要素」の数を返します。

これらの演算子は、タイプ(例:​​)またはラベル(例:TYPE myLabel)のいずれかに適用できます。
結果は、同じデータ構造(レコードなど)で異なる場合があります。

以下に、正確な意味を示します。

同様の名前の演算子.TYPEは、マクロで式に関する情報を含むバイトビットフィールドを返すために使用できることに注意してください(たとえば、レジ​​スタに名前を付けます)。
これは、MSDNの記述されていないMASMのドキュメントによって示されています。

MASM 6.1 reference document hereがありますが、私はどれだけ権威あるのかわかりませんが、この回答はすべてそれに基づいています。


タイプに適用した場合、SIZEOFTYPEオペレータSIZEOF

に類似演算子としてリストTYPEを文書プリミティブ

、整数のサイズを返しますそのタイプの。

各データ型に関連付けられているサイズ属性は次のとおりです。

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 

、オペレータは、ラベルで使用されている:以下の実施例は、これらの演算子を示します。

ストリングストリングの

、それは文字列はバイトの配列であることを想起すればよいです。

構造構造のため

が、コンセプトは、配列に似ていますSIZEOFは、ラベルに関連付けられているすべての構造オブジェクトのサイズがありながらTYPEは、構造体のサイズです(MASMは次のようなものを考えますmyLabel db 1, 2, 3myLabelに関連付けられた3バイト)であるとして:

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" 

ラベルとし、種類と演算子を使用している場合ここで少し非対称性があります。これは、メタプログラミングの味を持っており、

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 

:マクロ

この演算子はOPATTRの古いバージョンであり、次の内容のバイトを返すためのオペレータとして


.TYPE

通常はマクロで生成されたコードを最適化するために使用されます。

関連する問題