当前位置: 技术问答>linux和unix
内嵌汇编
来源: 互联网 发布时间:2016-06-17
本文导语: 我想实现c语言的变量input的值,存入eax, "movl %0,%%eax":"r"(input); 这样写不对吗?应该怎么写?? | 看一下下面的代码就知道为什么要将读写型操作数,分别在输入和输出部分加以描述。 该例...
我想实现c语言的变量input的值,存入eax,
"movl %0,%%eax":"r"(input);
这样写不对吗?应该怎么写??
"movl %0,%%eax":"r"(input);
这样写不对吗?应该怎么写??
|
看一下下面的代码就知道为什么要将读写型操作数,分别在输入和输出部分加以描述。
该例功能是求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。
该例功能是求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。
|
输入和输出搞反。
|
#include
int fun()
{
int input = 10;
__asm
__volatile__ ("movl %0,%%eax": :"d"(input));
}
int main() {
printf("%d",fun());
return 0;
}
你似乎少了:了
您可能感兴趣的文章:
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。