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