Программирование на Ассемблере


         

Проанализируем полученный файл. Из файла


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