Obsah / Utility / TEXT / TextWrite
Zdrojový kód:
INCLUDE\UTIL\TEXT.INC, UTIL\TEXT.ASM
TextWrite - Zápis
textu v kódu UTF-8 do bufferu
Funkce TextWrite zapíše do
bufferu text v kódu UTF-8.
; -----------------------------------------------------------------------------
; Write text UTF-8 into buffer
; -----------------------------------------------------------------------------
; INPUT: EBX = pointer to TEXT
; ECX = size of destination buffer (it is ignored if EDX = NULL)
; EDX = pointer to destination buffer (NULL = get size of data)
; OUTPUT: EAX = size of data in destination buffer
; -----------------------------------------------------------------------------
|
Na vstupu funkce obsahuje registr EBX
ukazatel na textovou proměnnou, ECX velikost cílového bufferu
(údaj se ignoruje, pokud je EDX = NULL) a EDX obsahuje ukazatel
na cílový buffer. Pokud je ukazatel na cílový buffer nulový,
funkce pouze navrátí požadovanou velikost cílového bufferu.
Na výstupu funkce navrátí v registru EAX velikost dat
uložených do cílového bufferu nebo požadovanou velikost
bufferu (je-li adresa bufferu nulová).
; ------------- Push registers
TextWrite: push ecx ; push ECX
push esi ; push ESI
push edi ; push EDI
; ------------- Prepare size of data (-> EAX)
mov esi,[ebx] ; ESI <- data buffer
mov eax,[esi+TEXT_Length] ; EAX <- text length
or edx,edx ; is destination buffer valid?
jz TextWrite4 ; destination buffer is not valid
cmp eax,ecx ; check length of text
ja TextWrite8 ; limit length of text
...................
; ------------- Limit length of text
TextWrite8: xchg eax,ecx ; EAX <- limit length of text
jmp short TextWrite2
|
Do registru ESI je připravena adresa
datového bufferu textu a do registru EAX délka textu. Je-li
adresa cílového bufferu nulová, je funkce ihned ukončena s
navrácením požadovné velikosti bufferu v registru EAX. Jinak
je délka textu omezena velikostí volného místa v cílovém
bufferu.
; ------------- Prepare pointers
TextWrite2: add esi,byte TEXT_Text ; ESI <- start of text
mov edi,edx ; EDI <- destination buffer
; ------------- Copy text
mov ecx,eax ; ECX <- length of text
shr ecx,2 ; ECX <- length of text in DWORDs
rep movsd ; shift text in DWORDs
mov ecx,eax ; ECX <- length of text
and ecx,byte 3 ; ECX <- rest in last DWORD
rep movsb ; copy rest of text
; ------------- Pop registers
TextWrite4: pop edi ; pop EDI
pop esi ; pop ESI
pop ecx ; pop ECX
ret
|
Registr ESI se posune na začátek
zdrojového textu. Do registru EDI se připraví začátek
cílového bufferu. Text se zkopíruje ze zdrojového do
cílového bufferu - nejdříve po celých dvojslovech a pak
zbylá data v posledním dvojslovu.
Obsah / Utility / TEXT / TextWrite