对gcc内嵌汇编的探索与实验(2)
2006-07-12 22:31
393 查看
对gcc内嵌汇编的探索与实验(2)
汇编调用函数的例子....AT&T ASM的操作数与被操作数与Intel格式刚好位置相反的,呵呵
下面是一个Hello World
#include <stdio.h>
#include <stdlib.h>
void t(char *a)
{
printf("%s/n",a);
}
int main(int argc, char *argv[])
{
char buff[13] = "Hello world!";
void ( *lpF)(char *) = t;
__asm__ __volatile__ //不要编译器进行优化
( : //out,这个冒号的一段是输出用的
:"r"(lpF) ,"r"(buff) //in,输入用的
:"memory","eax"
);
system("PAUSE");
return 0;
}
"push %%eax;"
"push %1;" //参数入栈
"call *%0;" //调用函数
"pop %%eax;"
按照规定,各个变量按照出现的先后顺序在asm中用%0,%1,%2......代替.所以上文%0就是lpF,%1就是buff啦.而寄存器在内嵌asm里用 %%寄存器名 表示,而如果直接编写AT&T汇编,只需用%寄存器名 表示就可以.稍有不同.可能是%被转义了.如果是立即数,必须在数字前加上$
如:push $12
汇编调用函数的例子....AT&T ASM的操作数与被操作数与Intel格式刚好位置相反的,呵呵
下面是一个Hello World
#include <stdio.h>
#include <stdlib.h>
void t(char *a)
{
printf("%s/n",a);
}
int main(int argc, char *argv[])
{
char buff[13] = "Hello world!";
void ( *lpF)(char *) = t;
__asm__ __volatile__ //不要编译器进行优化
( : //out,这个冒号的一段是输出用的
:"r"(lpF) ,"r"(buff) //in,输入用的
:"memory","eax"
);
system("PAUSE");
return 0;
}
"push %%eax;"
"push %1;" //参数入栈
"call *%0;" //调用函数
"pop %%eax;"
按照规定,各个变量按照出现的先后顺序在asm中用%0,%1,%2......代替.所以上文%0就是lpF,%1就是buff啦.而寄存器在内嵌asm里用 %%寄存器名 表示,而如果直接编写AT&T汇编,只需用%寄存器名 表示就可以.稍有不同.可能是%被转义了.如果是立即数,必须在数字前加上$
如:push $12
相关文章推荐
- 对gcc内嵌汇编的探索与实验(1)
- AT&T汇编语言语法及GCC的内嵌汇编语法
- ARM GCC 内嵌(inline)汇编手册
- GCC在C语言中内嵌汇编 asm __volatile__ (2)
- gcc将内嵌汇编编译成汇编
- GCC如何编译内嵌汇编代码
- GCC的内嵌汇编语法
- AT&T汇编语言与GCC内嵌汇编简介
- GCC的内嵌汇编语法
- ARM GCC 内嵌汇编手册
- GCC的内嵌汇编,也就是AT&T汇编语言语法
- GCC在C语言中内嵌汇编 asm __volatile__
- GCC的内嵌汇编语法 AT&T汇编语言语法
- ARM GCC 内嵌汇编手册
- AT&T汇编语言与GCC内嵌汇编简介
- GCC内嵌汇编语法
- GCC内嵌汇编(二)
- gcc 内嵌汇编用法
- arm gcc 内嵌汇编
- AT&T汇编语言与GCC内嵌汇编,Linux内核数据结构之链表