ÄúÏÖÔÚµÄλÖÃÊÇ£º Èí¼þ > ¿ª·¢ÕßÍøÂç > ÕýÎÄ
¡¤ËٳɵçÄÔ¾«Ó¢£¨°ü·ÖÅ䣩°×Áì¸ßнһ×å´ÓÕâÀ↑ʼ



-JavaÌ×½Ó×Ö±à³Ì£¨Ï£©
-MediaStudio Pro 6.5½Ì³Ì
-Èý¿îÐ¶ÔØÈí¼þ×îÐÂÊÔÓÃ
-»ùÓÚVisual C++µÄWinsock APIÑо¿

¹ØÓÚPBÓ¦ÓóÌÐòµÄ2000ÄêÎÊÌâ
2000-07-12¡¤ ¡¤-¡¤¡¤-

¡¡¡ÎÒµÄ×ÊÁÏÊÇÔÚÍøÉÏÈ¡À´,µ«ÊÇÕ¾µãÍü¼ÇÁË,ÓÐÐËȤµÄ¿ÉÒÔÔÚkhgÉϲé²é.

¡¡¡¡gcc²ÉÓõÄÊÇAT&TµÄ»ã±à¸ñʽ,MS²ÉÓÃIntelµÄ¸ñʽ£®

Ò»¡¡»ù±¾Óï·¨

¡¡¡¡Óï·¨ÉÏÖ÷ÒªÓÐÒÔϼ¸¸ö²»Í¬.

¡ï ¼Ä´æÆ÷ÃüÃûÔ­Ôò
AT&T: %eax Intel: eax

¡ïÔ´/Ä¿µÄ²Ù×÷Êý˳Ðò
AT&T: movl %eax,%ebx Intel: mov ebx,eax

¡ï³£Êý/Á¢¼´ÊýµÄ¸ñʽ
AT&T: movl $_value,%ebx Intel: mov eax,_value
°Ñ_valueµÄµØÖ··ÅÈëeax¼Ä´æÆ÷

AT&T: movl $0xd00d,%ebx Intel: mov ebx,0xd00d

¡ï ²Ù×÷Êý³¤¶È±êʶ
AT&T: movw %ax,%bx Intel: mov bx,ax

¡ïѰַ·½Ê½
AT&T: immed32(basepointer,indexpointer,indexscale)
Intel: [basepointer + indexpointer*indexscale + imm32)
Linux¹¤×÷ÓÚ±£»¤Ä£Ê½Ï£¬ÓõÄÊÇ£³£²Î»ÏßÐÔµØÖ·£¬ËùÒÔÔÚ¼ÆËãµØÖ·Ê±
²»Óÿ¼ÂÇsegment:offsetµÄÎÊÌ⣮ÉÏʽÖеĵØÖ·Ó¦Îª£º
imm32 + basepointer + indexpointer*indexscale

ÏÂÃæÊÇһЩÀý×Ó£º
¡ïÖ±½ÓѰַ
AT&T: _booga¡¡; _boogaÊÇÒ»¸öÈ«¾ÖµÄC±äÁ¿
×¢Òâ¼ÓÉÏ$ÊDZíʾµØÖ·ÒýÓ㬲»¼ÓÊDZíʾֵÒýÓã®
×¢£º¶ÔÓÚ¾Ö²¿±äÁ¿£¬¿ÉÒÔͨ¹ý¶ÑÕ»Ö¸ÕëÒýÓã®

Intel: [_booga]

¡ï¼Ä´æÆ÷¼ä½ÓѰַ
AT&T: (%eax)
Intel: [eax]

¡ï±äַѰַ
AT&T: _variable(%eax)
Intel: [eax + _variable]

AT&T: _array(,%eax,4)
Intel: [eax*4 + _array]
AT&T: _array(%ebx,%eax,8)
Intel: [ebx + eax*8 + _array]


¶þ¡¡»ù±¾µÄÐÐÄÚ»ã±à

»ù±¾µÄÐÐÄÚ»ã±àºÜ¼òµ¥£¬Ò»°ãÊǰ´ÕÕÏÂÃæµÄ¸ñʽ
asm("statements");
ÀýÈ磺asm("nop"); asm("cli");
asm¡¡ºÍ¡¡__asm__ÊÇÍêȫһÑùµÄ£®
Èç¹ûÓжàÐлã±à£¬ÔòÿһÐж¼Òª¼ÓÉÏ¡¡"\n\t"
ÀýÈ磺
asm( "pushl %eax\n\t"
"movl $0,%eax\n\t"
"popl %eax");
ʵ¼ÊÉÏgccÔÚ´¦Àí»ã±àʱ£¬ÊÇÒª°Ñasm(...)µÄÄÚÈÝ"´òÓ¡"µ½»ã±àÎļþÖУ¬ËùÒÔ¸ñʽ¿ØÖÆ×Ö·ûÊDZØÒªµÄ£®

ÔÙÀýÈ磺
asm("movl %eax,%ebx");
asm("xorl %ebx,%edx");
asm("movl $0,_booga);

¡¡¡¡ÔÚÉÏÃæµÄÀý×ÓÖУ¬ÓÉÓÚÎÒÃÇÔÚÐÐÄÚ»ã±àÖиıäÁËedxºÍebxµÄÖµ£¬µ«ÊÇÓ gccµÄÌØÊâµÄ´¦Àí·½·¨£¬¼´ÏÈÐγɻã±àÎļþ£¬ÔÙ½»¸øGASÈ¥»ã±à£¬ËùÒÔGAS²¢²»ÖªµÀÎÒÃÇÒѾ­¸Ä±äÁËedxºÍebxµÄÖµ£¬Èç¹û³ÌÐòµÄÉÏÏÂÎÄÐèÒªedx»òebx×÷Ôݴ棬ÕâÑù¾Í»áÒýÆðÑÏÖØµÄºó¹û£®¶ÔÓÚ±äÁ¿_boogaÒ²´æÔÚÒ»ÑùµÄÎÊÌ⣮ΪÁ˽â¾öÕâ¸öÎÊÌ⣬¾ÍÒªÓõ½À©Õ¹µÄÐÐÄÚ»ã±àÓï·¨£®
Èý¡¡À©Õ¹µÄÐÐÄÚ»ã±à

À©Õ¹µÄÐÐÄÚ»ã±àÀàËÆÓÚWatcom.

»ù±¾µÄ¸ñʽÊÇ£º
asm ( "statements" : output_regs : input_regs : clobbered_regs);

clobbered_regsÖ¸µÄÊDZ»¸Ä±äµÄ¼Ä´æÆ÷£®
ÏÂÃæÊÇÒ»¸öÀý×Ó(Ϊ·½±ãÆð¼û£¬ÎÒʹÓÃÈ«¾Ö±äÁ¿£©£º
int count=1;
int value=1;
int buf[10];
void main()
{
asm(
"cld \n\t"
"rep \n\t"
"stosl"
:
: "c" (count), "a" (value) , "D" (buf[0])
: "%ecx","%edi" );
}
µÃµ½µÄÖ÷Òª»ã±à´úÂëΪ£º
movl count,%ecx
movl value,%eax
movl buf,%edi
#APP
cld
rep
stosl
#NO_APP
cld,rep,stos¾Í²»Óöà½âÊÍÁË£®
¡¡¡¡Õ⼸ÌõÓï¾äµÄ¹¦ÄÜÊÇÏòbufÖÐдÉÏcount¸övalueÖµ£®
¡¡¡¡Ã°ºÅºóµÄÓï¾äÖ¸Ã÷ÊäÈ룬Êä³öºÍ±»¸Ä±äµÄ¼Ä´æÆ÷£®
¡¡¡¡Í¨¹ýðºÅÒÔºóµÄÓï¾ä£¬±àÒëÆ÷¾ÍÖªµÀÄãµÄÖ¸ÁîÐèÒªºÍ¸Ä±äÄÄЩ¼Ä´æÆ÷£¬´Ó¶ø¿ÉÒÔÓÅ»¯¼Ä´æÆ÷µÄ·ÖÅ䣮

¡¡¡¡ÆäÖзûºÅ"c"(count)ָʾҪ°ÑcountµÄÖµ·ÅÈëecx¼Ä´æÆ÷ÀàËÆµÄ»¹ÓУº
a eax
b ebx
c ecx
d edx
S esi
D edi
I ³£ÊýÖµ£¬(0 - 31)
q,r ¶¯Ì¬·ÖÅäµÄ¼Ä´æÆ÷
g eax,ebx,ecx,edx»òÄÚ´æ±äÁ¿
A °ÑeaxºÍedxºÏ³ÉÒ»¸ö64λµÄ¼Ä´æÆ÷(use long longs)

ÎÒÃÇÒ²¿ÉÒÔÈÃgcc×Ô¼ºÑ¡ÔñºÏÊʵļĴæÆ÷£®
ÈçÏÂÃæµÄÀý×Ó£º
asm("leal (%1,%1,4),%0"
: "=r" (x)
: "0" (x) );
Õâ¶Î´úÂëʵÏÖ5*xµÄ¿ìËٳ˷¨£®
µÃµ½µÄÖ÷Òª»ã±à´úÂëΪ£º
movl x,%eax
#APP
leal (%eax,%eax,4),%eax
#NO_APP
movl %eax,x
¼¸µã˵Ã÷£º
¡¡¡¡1.ʹÓÃqָʾ±àÒëÆ÷´Óeax,ebx,ecx,edx·ÖÅä¼Ä´æÆ÷£®
¡¡¡¡Ê¹ÓÃrָʾ±àÒëÆ÷´Óeax,ebx,ecx,edx,esi,edi·ÖÅä¼Ä´æÆ÷£®
¡¡¡¡2.ÎÒÃDz»±Ø°Ñ±àÒëÆ÷·ÖÅäµÄ¼Ä´æÆ÷·ÅÈë¸Ä±äµÄ¼Ä´æÆ÷ÁÐ±í£¬ÒòΪ¼Ä´æÆ÷ÒѾ­¼ÇסÁËËüÃÇ£®
¡¡¡¡3."="ÊDZêʾÊä³ö¼Ä´æÆ÷£¬±ØÐëÕâÑùÓã®
¡¡¡¡4.Êý×Ö%nµÄÓ÷¨£º
¡¡¡¡Êý×Ö±íʾµÄ¼Ä´æÆ÷Êǰ´ÕÕ³öÏֺʹÓ×óµ½ÓÒµÄ˳ÐòÓ³Éäµ½ÓÃ"r"»ò"q"ÇëÇóµÄ¼Ä´æÆ÷£®Èç¹ûÎÒÃÇÒªÖØÓÃ"r"»ò"q"ÇëÇóµÄ¼Ä´æÆ÷µÄ»°£¬¾Í¿ÉÒÔʹÓÃËüÃÇ£®
¡¡¡¡5.Èç¹ûÇ¿ÖÆÊ¹Óù̶¨µÄ¼Ä´æÆ÷µÄ»°£¬Èç²»ÓÃ%1,¶øÓÃebx,Ôò
asm("leal (%%ebx,%%ebx,4),%0"
: "=r" (x)
: "0" (x) );
×¢ÒâҪʹÓÃÁ½¸ö%,ÒòΪһ¸ö%µÄÓï·¨ÒѾ­±»%nÓõôÁË£®
¡ö Ïà¹ØÄÚÈÝ
¡¡ÓÃPB±àд¶àÏß³ÌÓ¦ÓóÌÐò
¡¡PBÖбàд10½øÖƵ½ÆäËû½øÖƵÄת»»º¯Êý
¡¡PB¶¯Ì¬±¨±í¸ñʽ×ÔÓɶ¨ÒåµÄʵÏÖ
¡¡ÔÚPBÖз½±ãµÄʵÏÖͼƬ¶¯Ì¬Çл»
¡¡ÈçºÎÔÚPB6Öв¥·ÅAVI¶àýÌåÎļþ
¸Ðл ·ÃÎÊÌì¼«Íø£¬Èç¹ûÄú¾õµÃ¸ÃÎÄÕÂÉæ¼°°æÈ¨ÎÊÌ⣬Çë¿´ÕâÀ