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

Obsah / Utility / TEXTFORM / SDWToTextBuf

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

Související:

SDWToTextBufN   Délka textu neformátovaného čísla DWORD se znaménkem
FormToTextBuf   Zformátování textu do bufferu

SDWToTextBuf - Konverze neformátovaného čísla DWORD se znaménkem na text

Funkce SDWToTextBuf konvertuje neformátované 32-bitové celé číslo se znaménkem na text.


; -----------------------------------------------------------------------------
;              Convert unformatted signed DWORD into text buffer
; -----------------------------------------------------------------------------
; INPUT:	EAX = signed number
;		ECX = minimal number of characters
;		ESI = remaining free space in buffer
;		EDI = destination buffer
; OUTPUT:	ESI = next remaining free space in buffer
;		EDI = next destination buffer
; -----------------------------------------------------------------------------

Na vstupu funkce obsahuje registr EAX číslo se znaménkem ke konverzi, registr ECX požadovaný minimální počet znaků (včetně znaménka), registr ESI zbývající volné místo v cílovém bufferu a registr EDI ukazatel na cílový buffer. Na výstupu z funkce jsou registry ESI a EDI posunuty na novou zápisovou pozici.


; ------------- Check if number is negative

SDWToTextBuf:	or	eax,eax		; is number negative?
		jns	short UDWToTextBuf ; number is not negative

; ------------- Store sign character into buffer

		or	esi,esi		; check free space
		jle	SDWToTextBuf9	; no free space left
		mov	byte [edi],"-"	; store sign character into buffer
		dec	esi		; decrease free space
		inc	edi		; increase destination pointer

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

		push	eax		; push EAX
		push	ecx		; push ECX

; ------------- Convert number into buffer

		neg	eax		; EAX <- absolute value
		sub	ecx,byte 1	; ECX <- text length without sign
		adc	ecx,byte 0	; ECX <- limit text length to 0
		call	UDWToTextBuf	; convert number to text

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

		pop	ecx		; pop ECX
		pop	eax		; pop EAX
SDWToTextBuf9:	ret

Je-li konvertované číslo nezáporné, je obsluha převedena na funkci pro konverzi čísla bez znaménka UDWToTextBuf, jinak se pokračuje obsluhou záporných čísel.

Není-li volné místo v cílovém bufferu, funkce se ukončí bez další obsluhy. Jinak se do výstupního bufferu uloží znaménko "-".

Konvertované záporné číslo se negací převede na absolutní hodnotu. Požadovaná minimální délka čísla v registru ECX se sníží o 1 bajt, který byl spotřebovaný uložením záporného znaménka. Přitom ale nesmí podtéct pod hodnotu 0 pokud byla předtím zadaná. Proto je dekrementace provedena "opatrně", pokud dekrementací nastalo podtečení pod nulu (nastavil se příznak přenosu CF), tak je následující instrukcí "adc" původní nula opět navrácena.

Výsledné číslo se poté zkonvertuje do výstupního bufferu voláním funkce UDWToTextBuf.


Obsah / Utility / TEXTFORM / SDWToTextBuf