Проанализируем полученный файл. Из файла
jmp short @3
@2:
inc dword ptr [ebp-4]
@3:
mov edx,dword ptr [ebp+8]
mov ecx,dword ptr [edx]
mov eax,dword ptr [ebp-4]
cmp byte ptr [ecx+eax],0
jne short @2
?debug L 7
mov eax,dword ptr [ebp-4]
?debug L 8
@6:
@5:
pop ecx
pop ebp
ret
?debug L 0
@@STRING@len$qv endp
…
Проанализируем полученный файл. Из файла видно, что имя функции – члена формируется из имени класса, имени функции и типов параметров. Это имя лучше всего взять из объектного файла вызывающей программы.
Для объекта класса передается адрес, где находится адрес начала этого объекта, т.е. первой внутренней переменной этого класса (параметр функции). Для доступа к самой переменной используется две команды:
mov edx,dword ptr [ebp+8]
mov ecx,dword ptr [edx]; &s
Еще раз обратите внимание на неэффективное использование локальной переменной внутри класса!
Кроме приведенных выше команд используются дополнительные команды. Анализ команд программы показывает, что проще переписать команды определителя функции – члена класса внутри функции на языке С++.
Реализация функции
#include "mystr.h"
int STRING::len(){
asm {
mov eax, -1
mov ecx, [ebp+8]
mov ecx, [ecx]
for1:
inc eax
cmp byte ptr [ecx+eax], 0
jne for1
}
}
Сравните эффективность кода с ассемблерной вставкой и без нее!
Содержание Назад Вперед
Forekc.ru
Рефераты, дипломы, курсовые, выпускные и квалификационные работы, диссертации, учебники, учебные пособия, лекции, методические пособия и рекомендации, программы и курсы обучения, публикации из профильных изданий