Вы не можете выбрать более 25 тем
Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.
74 строки
1.6 KiB
74 строки
1.6 KiB
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
|
; Puts the stringified version of eax on the stack |
|
; IN: eax = number to write |
|
; IN: edi = base of where to write string |
|
; OUT: ecx = number of characters written to buffer |
|
IntToString: ; (eax = number, edi = buffer base) -> ecx = number of characters |
|
push eax |
|
push edi |
|
;push ecx |
|
push edx |
|
push esi |
|
push ebp |
|
|
|
mov ecx, edi ; store negative original buffer base |
|
neg ecx ; (used for counting amount of characters) |
|
|
|
test eax, eax |
|
jns .not_negative |
|
|
|
mov BYTE [edi], '-' |
|
neg eax |
|
add edi, 1 |
|
|
|
.not_negative: |
|
mov esi, edi ; store pointer after potential negative sign character |
|
mov ebp, 0xcccccccd ; ebp = 32 bit multiplicative reciprocal of 10 |
|
|
|
.divide_loop: |
|
|
|
mov ebx, eax ; save number in ebx |
|
|
|
mul ebp |
|
shr edx, 3 ; edx = quotient |
|
|
|
lea eax, [edx + edx*4] ; eax = quotient * 10 = (number - remainder) |
|
add eax, eax ; | |
|
|
|
sub ebx, eax ; ebx = number - (number - remainder) = remainder |
|
|
|
add ebx, '0' ; remainder is our digit, turn it ASCII |
|
mov BYTE [edi], bl ; store ASCII digit to buffer |
|
lea edi, [edi+1] |
|
|
|
mov eax, edx ; We need quotient in eax for 'mul' |
|
|
|
test eax, eax |
|
jne .divide_loop |
|
|
|
add ecx, edi ; Update amount of characters |
|
|
|
mov byte [edi], 0 ; Null terminator |
|
|
|
lea edi, [edi-1] ; We incremented the buffer pointer once too much |
|
|
|
.swap_loop: |
|
cmp esi, edi |
|
jae .done_swapping |
|
movzx eax, BYTE [edi] |
|
movzx edx, BYTE [esi] |
|
mov BYTE [edi], dl |
|
mov BYTE [esi], al |
|
sub edi, 1 |
|
add esi, 1 |
|
jmp .swap_loop |
|
|
|
.done_swapping: |
|
|
|
pop ebp |
|
pop esi |
|
pop edx |
|
;pop ecx |
|
pop edi |
|
pop eax |
|
ret |