Особенности использования ассемблерных функций в качестве функций – членов классов
Пусть задан класс:
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ЁртэшЄх ¤ЇЇхъЄштэюёЄ№ ъюфр ё рёёхьсыхЁэющ тёЄртъющ ш схч эхх!