Tvůrce webu je i pro tebe! Postav třeba web. Bez grafika. Bez kodéra. Hned.
wz

Obsah / Utility / TEXTFORM / FormGetArgLen

Zdrojový kód: INCLUDE\UTIL\TEXTFORM.INC, UTIL\TEXTFORM.ASM

Související:

FormToTextBuf   Zformátování textu do bufferu
FormToTextBufN   Délka formátovaného textu

FormGetArgLen - Zjištění délky formátovacího argumentu

Funkce FormGetArgLen slouží ke zjištění velikosti formátovacího argumentu v zásobníku pro funkci FormToTextBuf.


; -----------------------------------------------------------------------------
;                    Get argument length in argument stack
; -----------------------------------------------------------------------------
; INPUT:	EBX = formatting parameters FORMPAR
; OUTPUT:	EAX = argument length (in DWORDs: 1, 2 or 3)
; NOTES:	64-bit integer or double float takes 2 DWORDs, extended double
;		takes 3 DWORDs and other numbers take 1 DWORD.
; -----------------------------------------------------------------------------

Vstupním argumentem funkce jsou v registru EBX formátovací parametry FORMPAR (ne ukazatel). Na výstupu z funkce obsahuje registr EAX délku argumentu v násobcích dvojslov DWORD (hodnota 1, 2 nebo 3). 64-bitový argument nebo číslo v dvojité přesnosti zabere 2 dvojslova (tj. 8 bajtů). Desetinné číslo s rozšířenou přesností zabere 3 dvojslova (tj. 12 bajtů). Ostatní argumenty zaberou 1 dvojslovo (4 bajty).


; ------------- Push registers

FormGetArgLen:	push	ebx		; push EBX

; ------------- Prepare minimal argument length in DWORDs (-> EAX)

		xor	eax,eax		; EAX <- 0
		inc	eax		; EAX <- 1, default length 1 DWORD

; ------------- Prepare argument type (-> BL) and flags (-> BH)

		shr	ebx,FORMPAR_TypeF_b ; EBX <- type and flags
		and	bl,FORMTYPE_Mask0 ; BL <- argument type

; ------------- Argument type "always 1 DWORD"

		cmp	bl,FORMTYPE_ArgDW ; is it 1 DWORD argument type?
		jbe	FormGetArgLen4	; it is 1 DWORD argument type

Funkce přednastaví do registru EAX délku 1 a do registru EBX typ argumentu. Všechny argumenty typu FORMTYPE_ArgDW a nižší budou mít délku 1 dvojslovo.


; ------------- Argument length if "double float"

		cmp	bl,FORMTYPE_ArgInt ; integer argument?
		jbe	FormGetArgLen2	; integer argument
		test	bh,FORMFLAG2_Shrt ; short argument?
		jnz	FormGetArgLen2	; yes, short argument (single float)
		inc	eax		; AL <- 2, argument length for "double"

; ------------- Increase argument length if "long" flag is set

FormGetArgLen2:	test	bh,FORMFLAG2_Long ; long argument?
		jz	FormGetArgLen4	; not long argument
		inc	eax		; increase argument length for "long"

; ------------- Pop registers

FormGetArgLen4:	pop	ebx		; pop EBX
		ret

Je-li argumentem desetinné číslo (tj. argumenty vyšší než typ FORMTYPE_ArgInt) a nemají-li sníženou přesnost (příznak FORMFLAG2_Shrt), jedná se o číslo s dvojnásobnou přesností, jehož délka bude 2 dvojslova (tj. 8 bajtů).

Posledním testem je rozlišení argumentu dlouhého typu, délka takového argumentu bude zvýšena o 1 dvojslovo. Jendá se o celočíselné argumenty 64 bitů, které mají délku 2 dvojslova (8 bajtů) a o desetinná čísla s rozšířenou přesností, která mají délku 3 dvojslova (12 bajtů).


Obsah / Utility / TEXTFORM / FormGetArgLen