;на входе:
;string_bin_qword - адрес 64-битной ячейки (описанной dt) с преобразуемым
:двоичным целым числом
:string_pack - адрес 80-битной ячейки (описанной dt), в которую сохраняется
упакованное 10-е значение
:adr_string_pack - ячейка с адресом string_pack (описанной dd)
:len_string_pack - длина string_pack
:adr_string - ячейка с адресом string (описанной dd). В string помещаются
;символы десятичных цифр для вывода.
:len_string - размер string (18 байт)
:.........преобразуем bin->dec
finit
f 11d string_bin_qword :заносим в сопроцессор двоичное целое число fbstp string_pack извлекаем упакованное десятичное
¦-------------распакуем..........
Ids si.adr_string_pack
add si.len_string_pack-2 :на конец string_pack (18 упак. дес. цифр)
les di.adr_string
movcx.9 ;9 пар упакованных десятичных цифр
xor ax,ax cycl: xor ax,ax
std ;string_pack обрабатываем с конца
lodsb ;в al очередные 2 упакованные десятичные цифры
распаковываем - аИ=младшая, а1=старшая
shi ax.4
rol al .4
or ах.ЗОЗОп :преобразуем в символьное представление
xchg ah .al :ап-младшая. al-старшая
eld :в string записываем с начала
stosw
loop cycl
;.........выводим на консоль...............................
' mov bx.l стандартный дескриптор - экран
mov cx.len_string
Ids dx.adr_string -.формируем указатель на строку string
mov ah.40h :номер функции DOS
int 21h :выводим
jc exit ;переход в случае ошибки
endm
profileMn macro val_l:REQ
;val_l - ячейка памяти 64 бита (2x32) для сохранения момента :начала профилирования ("грязного") pushad сохранение всех регистров общего назначения в стеке
db Ofh.31h;RDTSC mov val_l+4.edx
mov va!_l.eax popad восстановление всех регистров общего назначения из стека
endm
profiler_out macro val_l:REQ. val_2:REQ
:val_l - ячейка памяти 64 бита (2x32). 8 которой при входе в макрос сохранен :момент начала профилирования командой profilerjn. Далее в макросе эта ячейка :содержит результат профилирования - число тактов процессора :val_2 - ячейка памяти 64 бита (2x32). в которой сохраняется момент ("грязный") окончания профилирования