Для преобразования и форматированного вывода 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 на нужное значение. Или, как вариант, ввести дополнительный параметр вызова функции, определяющий основание.