¡¡¡ÎÒµÄ×ÊÁÏÊÇÔÚÍøÉÏÈ¡À´,µ«ÊÇÕ¾µãÍü¼ÇÁË,ÓÐÐËȤµÄ¿ÉÒÔÔÚ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ÓõôÁË£®
|