Мониторинг обменных курсов валют
18c0693f

Особенности использования ассемблерных функций в качестве функций – членов классов


Пусть задан класс:

class STRING{

    char *s;

    public:

    STRING (char * c){

          s = new char[strlen(c)+1];

          strcpy (s, c);

    }

    ~STRING (){

   delete []s;

      }

    public:

    int len ()

};

Пусть функцию определения длины строки необходимо определить на ассемблере. Определим ее сначала на С. Получим файл:

#pragma inline

#include "mystr.h"

int STRING::len(){

  int i;

   for (i=0; s[i]; i++);

   return i;

}

Здесь директива #pragma inline задана с целью формирования ассемблерного кода. В результате трансляции получим файл на ассемблере, основна часть которого приведена ниже:

            .386p

            ifdef ??version

            if    ??version GT 500H

            .mmx

            endif

            endif

            model flat

            ifndef   ??version

            ?debug            macro

            endm

            endif

            ?debug            S "E:\users\lena\INSTITUT\ASM\USKOR\cl.cpp"

            ?debug            T "E:\users\lena\INSTITUT\ASM\USKOR\cl.cpp"

_TEXT segment dword public use32 'CODE'

_TEXT ends

_DATA            segment dword public use32 'DATA'

_DATA            ends

_BSS    segment dword public use32 'BSS'

_BSS    ends

$$BSYMS        segment byte public use32 'DEBSYM'

$$BSYMS        ends

$$BTYPES      segment byte public use32 'DEBTYP'

$$BTYPES      ends

$$BNAMES     segment byte public use32 'DEBNAM'

$$BNAMES     ends

$$BROWSE    segment byte public use32 'DEBSYM'

$$BROWSE    ends

$$BROWFILE            segment byte public use32 'DEBSYM'

$$BROWFILE            ends

DGROUP       group   _BSS,_DATA

_TEXT segment dword public use32 'CODE'

@STRING@len$qv    segment virtual

@@STRING@len$qv proc     near

?live16385@0:

            ?debug L 4

            push      ebp

            mov       ebp,esp

            push      ecx

            ?debug L 6

@1:

            xor       eax,eax

            mov       dword ptr [ebp-4],eax


ааааааааааа 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
Е
¦ЁюрэрышчшЁєхь яюыєўхээvщ Їрщы. Lч Їрщыр тшфэю, ўЄю шь  ЇєэъЎшш Ц ўыхэр ЇюЁьшЁєхЄё  шч шьхэш ъырёёр, шьхэш ЇєэъЎшш ш Єшяют ярЁрьхЄЁют. ¦Єю шь  ыєў°х тёхую тч Є№ шч юс·хъЄэюую Їрщыр тvчvтр¦•хщ яЁюуЁрььv.
-ы  юс·хъЄр ъырёёр яхЁхфрхЄё  рфЁхё, уфх эрїюфшЄё  рфЁхё эрўрыр ¤Єюую юс·хъЄр, Є.х. яхЁтющ тэєЄЁхээхщ яхЁхьхээющ ¤Єюую ъырёёр (ярЁрьхЄЁ ЇєэъЎшш). -ы  фюёЄєяр ъ ёрьющ яхЁхьхээющ шёяюы№чєхЄё  фтх ъюьрэфv:
movаааааа edx,dword ptr [ebp+8]
movаааааа ecx,dword ptr [edx]; &s
+•х Ёрч юсЁрЄшЄх тэшьрэшх эр эх¤ЇЇхъЄштэюх шёяюы№чютрэшх ыюъры№эющ яхЁхьхээющ тэєЄЁш ъырёёр!
¦Ёюьх яЁштхфхээvї тv°х ъюьрэф шёяюы№чє¦Єё  фюяюыэшЄхы№эvх ъюьрэфv. Lэрышч ъюьрэф яЁюуЁрььv яюърчvтрхЄ, ўЄю яЁю•х яхЁхяшёрЄ№ ъюьрэфv юяЁхфхышЄхы  ЇєэъЎшш Ц ўыхэр ъырёёр тэєЄЁш ЇєэъЎшш эр  чvъх T++.
¦хрышчрЎш  ЇєэъЎшш
#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
а }
}
TЁртэшЄх ¤ЇЇхъЄштэюёЄ№ ъюфр ё рёёхьсыхЁэющ тёЄртъющ ш схч эхх!




Самый выгодный курс обмена валюты