pushad сохранение всех регистров общего
pushad сохранение всех регистров общего назначения в стеке db 0fh,31h :RDTSC - окончание профилирования
mov val_2+4.edx
mov val_2,eax
профилируем pushad и popad с учетом двух shrd pushad popad
db 0fh.31h;RDTSC
:теперь необходимо получить чистое время профилирования, для чего результат необходимо скорректировать (уменьшить) на количество тактов процессора, :потребное для выполнения пар команд PUSHAONPOPAD и M0V
subeax, val_2
jnc $+4 :учет заема из старшего разряда
dec edx
subedx. val_2+4 ;в edx:eax кол-ва тактов для выполнения 2-х команд ;PUSHAD\POPAD и 2-х SHRD
mov eax,val_l
sub val_2.eax
mov eax.val_l+4
jnc $+7 :учет заема из старшего разряда при выполнении предыдущего вычитания
dec val_2+4
sub val_2+4,eax
;в val_2:val_2+4 - чистое количество тактов процессора для выполнения профилируемого участка
popad восстановление всех регистров общего назначения из стека
:выводим
bin_dec_fpu val_2_q. string_pack, adr_string_pack, len_string_pack. adr_string. len_string
endm .data
val_2 label dword val_2_q dq 0 val_l label dword
dq 0
:b string_pack исходное значение из val_2_q в упакованном десятичном формате string_pack dt О
len_string_pack=$-string_pack adr_stringpack dd string_pack
string db 18 dup (0) максимальный результат состоит из 18 десятичных цифр
len_string=$-string adr_string dd string
.code
профилируем выполнение команд работы со стеком profiIer_i n val_l
push eax
pop eax
profiler_out val_l. val_2 exit: :выход из программы
Составьте тестовые примеры и «поиграйтесь» с данной программой. Обратите внимание, что при задании пустой последовательности команд между парой макросов profilerjn и profi1er_out все равно получается некоторая величина профилирования. Она постоянна, ее источник — сами команды RDTSC, которые требуют тактов процессора для своего исполнения. Эту величину можно скорректировать разными способами, но можно и не трогать, а учитывать при подведении окончательных результатов тестирования нужного вам фрагмента кода. На компьютере автора эта величина равна 52.
В этой программе для визуализации результатов профилирования разработана макрокоманда bi n_dec_fpu, производящая перевод значения из двоичной системы в десятичную.
Содержание Назад