AT&Tアセンブリ言語とGCC埋め込みアセンブリ概要


from:http://www.tongyi.net/develop/Assemble/1053151.html
AT&T     GCC      

0.1
04/3/30
EMAIL [email protected]


1 AT&T INTEL
1.1
1.2
1.3
1.4
1.5
1.6

2 GCC
2.1
2.2
2.3
2.3.1
2.3.2
2.3.3
2.3.4
2.3.5
2.4GCC

3


AT&T INTEL , GCC 。 INTEL




1 AT&T INTEL


1.1

INTEL , AT&T


INTEL AT&T
MOV EAX,EBX movl %ebx,%eax
1.2


INTEL , , , 。
AT&T , , , 。



INTEL AT&T
MOV EAX,EBX movl %ebx,%eax
1.3

INTEL ;
AT&T “%”; “___FCKpd___0rdquo;。



INTEL AT&T
MOV EAX,1 movl $1,%eax

, , :
movl value , %ebx
value ;
$, ,

movl $value, %ebx
value ebx 。

“lock”:
。“lock” Linux
, SMP
。 CPU


“l“, ljmp,lcall,
lret。


INTEL AT&T

lcall $secion:$offset
JMP FAR SECTION:OFFSET ljmp $secion:$offset
RET FAR SATCK_ADJUST lret $stack_adjust

1.4

INTEL “[”、“]”, AT&T“(”、“)”;

INTEL Segreg:[base+index*scale+disp]
, AT&T %segreg:disp(base,index,sale), segreg
,index,scale,disp , index Scale
1。Scale,disp “&”。

INTEL AT&T
Instr foo,segreg:[base+index*scale+disp] instr %segreg:disp(base,index,scale),foo

1.5


AT&T
,“b” byte
( );“w” word(2, );“l” long(4, )。
INTEL :
BYTE PTR、WORD PTR、DWORD PTR。


INTEL AT&T
mov al, bl movb %bl,%al
mov ax,bx movw %bx,%ax
mov eax, dword ptr [ebx] movl (%ebx), %eax


AT&T , , , 。AT&T “movs”, “movz
”( Intel “movsx” “movzx”)。 ,“movsbl %al,%edx” al
, edx
。 :

l
bl: , >-> l
bw: , >-> l
wl: , ->

,“f” (forward),
“b,” (back)。


jmp 1f
jmp 1f

1.6
INTEL AT&T , 。 I386Manual。



2 GCC

2.1

C
, , 。GCC , C , 。






__asm__
__volatile__("hlt");

“__asm__” ,“asm” “__asm__” 。
“__volatile__” , ,
“volatile” 。 。

2.2 , C
, C
, C
, C , GCC





, , C ,
GCC 。 :

__asm__ __violate__
("movl %1,%0" : "=r" (result) : "m" (input));







“movl %1,%0” ;“%0” “%1” , , C
。 C
, :“result” “input”,
“%0”,“%1,” ; : C “%0”; “%1
”, , 10 , “%0”,“%1”….“%9,” 。
, 。“result”
“=r”, “=” “result” ,“r
” “result” , ,
, “result” ,
“result”, “result” , GCC
, 。“input” “r”
, 。




C , gcc –c–S C
, , GCC 。



C , , 。


extern int
input,result;

void test(void)
{
input
= 1;
__asm__ __volatile__ ("movl %1,%0" :
"=r" (result) : "r" (input));
return
;
}







;



1
7
8 movl $1, input C input = 1;
9 input, %eax
10 #APP GCC ,
11 movl %eax,%eax
12 #NO_APP GCC ,
13 movl %eax, result result
14

18
。。。。。。

, 9 13 GCC, ,GCC
C , “r” , :
movl input, %eax

input %eax;GCC, result
, %eax, :

movl %eax, result


C result 。 result
input, %eax,GCC %eax,
%0,%1

movl %eax,%eax
。 , 。

,C GCC , GCC
。 ,
, “r”, “m”(m, ,
), :

movl input, result

, 。 movl
, , ,
“m” 。

2.3




__asm__(
:
:
:
)


: , , , , “:”
, , , , ,
“:” , 。 :

__asm__ __volatile__(
"cli":
:
:"memory")

2.3.1


, “;”、“/n” “/n/t” 。
C , 10 , :%0,%1…,%9。
, long (4, ),
, , 。
。 % ,
“b” ,“h” , :%h1。

2.3.2

, ,
C 。 “=” 。



__asm__ __volatile__("pushfl ; popl %0 ; cli":"=g" (x) )

, GCC
, C C 。

2.3.3

, ,
C C 。


1:
__asm__ __volatile__ ("lidt %0" : : "m" (real_mode_idt));


(bitops.h):

Static __inline__ void __set_bit(int nr,
volatile void * addr)
{
__asm__(
"btsl%1,%0" :
"=m"(ADDR) :
"Ir"(nr));
}

(*addr) nr 1。 %0 C, ADDR
, %1 C, nr 。 :
btsl nr, ADDR, , nr “Ir”,
nr, , ADDR 。

2.3.4
2.3.4.1
, , i386
。 C
, ,






“a” eax

: eax , ?

: GCC eax ,
pushl %eax, eax ,
popl %eax, eax

“b” ebx
“c” ecx
“d” edx
“s” esi
“d” edi
“q” eax,ebx ,ecx ,edx
“r” , eax ,ebx,ecx,edx,esi,edi
“A” eax edx, 64 (uselong longs)
“m”
“o” , , ,
“V” ,
“,” ,
“p” ( )




“g” eax,ebx,ecx ,edx
“X”



“I” 0-31 ( 32 )
“J” 0-63 ( 64 )
“N” 0-255 , ( out )
“i”
“n” , , “n” “i”




“0”,“1 ,”... “9 ”

, ,
“0 ” “%1” , “%1” “%0” ,
0-9 , “%0”-“%9” , , 。


&






“=” ( )
“+” ( )


“f”


“t”
“u”
“G” 80387


%


addl ( )


# ,

* ,



"=m" (ADDR) ADDR (“m”), (“=”);"Ir" (nr) nr,
0-31 (“I”) (“r”)。



2.3.4.2


I386
( ,
), addl %1,%0, %0 %1 %0,
%0 。 GCC ,
, , ,
GCC ,
C , , ,





:“0”、“1”……“9,”, C
%0,%1,……%9 C 。 “0” %1, ,
%0 %1 C, 。


, 。


input+result , result:


extern int input,result;

void test_at_t()
{
result= 0;
input = 1;
__asm__
__volatile__ ("addl %1,%0":"=r"(result): "r"(input));

}



movl $0,_result
movl $1,_input
movl _input,%edx /APP
addl %edx,%eax /NO_APP
movl %eax,%edx
movl %edx,_result

input , ,GCC %edx, addl %edx,
input 。 “r” , GCC
;“m” 。 input addl, %eax
, result 。 :movl %eax,%edx movl %edx,_result
result, result input , %edx。



1. “r” ,GCC , ,



2. “r” ,GCC , ,
,GCC
, ( AT&T CISC
, CISC , RISC
, add r0,r1,r2,r0, r1 ,r2 , ,
, r2 ,
r2, CPU ), GCC ,



3. , ,
。 %edx。 addl result 。


, , addl result
, result ( result
)。 ( input “r,” “m”):


extern int input,result;

void test_at_t()
{

result = 0;
input = 1;
__asm__
__volatile__ ("addl %2,%0":"=r"(result):"r"(result),"m"(input));

}


, %0 %1 result ,
, GCC %0 %1, C (
), %0 %1 。 。

movl $0,_result
movl $1,_input
movl _result,%edx /APP
addl _input,%eax /NO_APP
movl %eax,%edx
movl %edx,_result

addl result %edx, addl %0
%eax, %edx, , GCC
,GCC result , GCC ,



,GCC (
)。 :


extern int input,result;

void test_at_t()
{
result = 0;
input = 1;
__asm__
__volatile__ ("addl %2,%0":"=r"(result):"0"(result),"m"(input));

}

result “0” , %1 %0, ,
, , result
。 %0 %1, C , , 。




movl $0,_result
movl $1,_input
movl _result,%edx
movl %edx,%eax /APP
addl _input,%eax /NO_APP
movl %eax,%edx
movl %edx,_result


result %edx, addl %edx result %eax,
%eax %edx, result 。 GCC
:addl %edx, result
%edx %0, , ,
, GCC , ,
, C , GCC, ,
, %edx , %edx, 。


。 GCC “+”,
,GCC , , ,



;
extern int input,result;

void test_at_t()
{

result = 0;
input = 1;
__asm__
__volatile__ ("addl %1,%0":"+r"(result):"m"(input));

}


“+” “=”, result , :
movl $0,_result
movl $1,_input
movl _result,%eax /APP
addl _input,%eax /NO_APP
movl %eax,_result
L2:
movl %ebp,%esp

, 。


2.3.4.3 “&”

“&” , ,


, foo ret :


__asm__ ( “call foo;movl %%edx,%1”, :”=a”(ret) : ”r”(bar) );


int %eax , gcc
%eax, :

movl bar, %eax
#APP
call foo
movl %ebx,%eax

#NO_APP
movl %eax, ret

, GCC %eax 。 “&”
, bar %eax , ret 。

_asm__ ( “call foo;movl %%edx,%1”,:”=&a”(ret) : ”r”(bar) );


2.3.5

2.3.5.1


: 。 :
l

l

l

l



( C ): ,
, ,
; ,
。 ,
。 ,
, (
, , ,
), (
), ,
。 “r”,“g”
, 。


, , ;
“memory”。 :“%eax”,“%ebx”,“memory” 。


GCC ( GCC )


, AT&T ,
“%” , “%” , asm
“%%” 。 “%” asm, “/” C
, “%%” “%”。

( ):

int main(void)
{
int input, output,temp;
input = 1;

__asm__ __volatile__ ("movl $0, %%eax;/n/t
movl %%eax, %1;/n/t
movl %2, %%eax;/n/t
movl %%eax, %0;/n/t"
:"=m"(output),"=m"(temp) /* output */
:"r"(input) /* input */
);
return 0;
}


%eax , C :“temp = 0;output=input”,


movl $1,-4(%ebp)
movl -4(%ebp),%eax /APP
movl $0, %eax;
movl %eax, -12(%ebp);
movl %eax, %eax;
movl %eax, -8(%ebp); /NO_APP

GCC input %eax, ,output 0, input。




int main(void)
{
int input, output,temp;

input = 1;

__asm__ __volatile__
( "movl $0, %%eax;/n/t
movl %%eax, %1;/n/t
movl %2, %%eax;/n/t
movl %%eax, %0;/n/t"
:"=m"(output),"=m"(temp) /* output */
:"r"(input) /* input */
:"eax"); /* */

return 0;
}




movl $1,-4(%ebp)
movl -4(%ebp),%edx /APP
movl $0, %eax;
movl %eax, -12(%ebp);
movl %edx, %eax;
movl %eax, -8(%ebp); /NO_APP


,GCC %eax , input %edx。
: GCC , 。


CPU cc, “cc”。

2.3.5.2 memory

“memory” , 。 ,
, C volatile。 。

2.3.5.2.1

CPU , , Cache,
。 CPU ,
, CPU , 。 。
: , 。
: ; CPU ,



, , 。 ( ) (memory barrier),linux 。

void Barrier(void)

, , CPU
, 。

2.3.5.2.2 C volatile

C volatile( __volatile__)
, , 。
, ,
, , :


DWORD __stdcall threadFunc(LPVOID signal)
{

int* intSignal=reinterpret_cast