Вывод QWORD в виде десятичного числа

Для преобразования и форматированного вывода 32-битных значений в ассемблере используется стандартная API-функция wsprintf, но она бесполезна при работе с большими числами, например QWORD (64 бита). Значит обойдемся совсем без использования API.
;---------------------------------------------------
; Преобразование QWORD в десятичное число
; Параметры вызова:
; dwHigh - Старшее двойное слово
; dwLow  - Младшее двойное слово
; lpBuff - указатель на буфер-приемник
;---------------------------------------------------
proc    bignum dwHigh:DWORD, dwLow:DWORD, lpBuff:DWORD
        pushad                   ; Сохранить все регистры
        mov     eax,[dwLow]      ; Младшее двойное слово
        mov     edx,[dwHigh]     ; Старшее двойное слово
        mov     edi,[lpBuff]     ; Указатель на буфер-приемник
 
        xchg    esi,edx          ; Сохранить старший dword
        mov     ebx,10           ; Основание системы счисления
        xor     ecx,ecx          ; Счетчик десятичных цифр
.bignum_1:
        xchg    eax,esi          ; Расчитать десятичную цифру
        xor     edx,edx
        div     ebx
        xchg    esi,eax
        div     ebx
        or      dl,'0'           ; Преобразовать результат в символ цифры
        push    edx              ; Сохранить цифру в стеке
        inc     ecx              ; Увеличить счетчик цифр
        or      eax,eax          ; Все преобразовали?
        jnz     .bignum_1
 
.bignum_2:
        pop     eax              ; Записать все цифры из стека в буфер
        stosb
        loop    .bignum_2
        xor     eax,eax          ; Признак окончания строки
        stosb
        popad                    ; Восстановить все регистры
        ret                      ; Ворзврат из процедуры
endp

Пример использования:
; Сегмент данных
section '.data' data readable writeable
...
buff rb 100h
 
; Сегмент кода
section '.code' code readable executable
...
        mov     edx,70655326h  ; EDX:EAX = 7065532612345678h
        mov     eax,12345678h  ; в десятичной системе это 8098970927874987640
        stdcall bignum, edx, eax, buff
        ; После выполнения буфер содержит строку "8098970927874987640"

Функция получилась достаточно универсальной. Для преобразования числа в другую систему счисления с основанием, отличным от 10, достаточно изменить в коде функции mov ebx,10 на нужное значение. Или, как вариант, ввести дополнительный параметр вызова функции, определяющий основание.
Теги:
QWORD
Добавлено: 10 Апреля 2018 20:36:27 Добавил: Андрей Ковальчук Нравится 0
Добавить
Комментарии:
Нету комментариев для вывода...