Îñîáåííîñòè èñïîëüçîâàíèÿ àññåìáëåðíûõ ôóíêöèé â êà÷åñòâå ôóíêöèé – ÷ëåíîâ êëàññîâ
Ïóñòü çàäàí êëàññ:
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¨ðòýøªõ ¤¯¯õúªøòýþ¸ª¹ úþôð ¸ ð¸¸õüñûõ¨ýþù ò¸ªðòúþù ø ñõ÷ ýõõ!