当前位置:  技术问答>linux和unix

内嵌汇编

    来源: 互联网  发布时间:2016-06-17

    本文导语:  我想实现c语言的变量input的值,存入eax, "movl %0,%%eax":"r"(input); 这样写不对吗?应该怎么写?? | 看一下下面的代码就知道为什么要将读写型操作数,分别在输入和输出部分加以描述。 该例...

我想实现c语言的变量input的值,存入eax,
"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。

|
输入和输出搞反。

|

#include 

int fun()
{
int input = 10;
__asm
__volatile__ ("movl %0,%%eax": :"d"(input));
}
int main() { 
   printf("%d",fun());
return 0;



你似乎少了:了

    
 
 

您可能感兴趣的文章:

 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • linux下objdump命令用法介绍及如何使用objdump命令进行反汇编
  • linux中所用的汇编怎么和我们学的汇编不一样?
  • linux内核源代码中的汇编部分与其他汇编有不同的地方吗?
  • 有没有at@t汇编格式和intel 汇编格式互相转换的工具啊!
  • 请问有没有用AT&T汇编语法讲汇编语言的书?
  • gcc和objdump能生成Intel汇编吗?AT&T格式汇编看着不太习惯
  • 请教,X86汇编转AT&T汇编,急急
  • ARM汇编中的里的SUBS,后面的S是什么意思?顺便求本汇编的好书。
  • 如何将ARM汇编代码变成GNU汇编?
  • 高分求助:linux内核中的汇编语言和Dos或windows下的汇编是一样的吗,有这方面的书或资料可供学习吗,分不够可再加,决不食言
  • 强力推荐一本LINUX下汇编(即AT&T汇编)的新书
  • 请问一下,汇编器as是否就是gas?
  • 请问各位大虾,如何在linux环境下学习汇编?
  • GCC内联汇编如何调试
  • LINUX下的汇编 怎么看????高手指导语法
  • 请问汇编器和编译器各自完成那些功能啊?
  • 想学汇编
  • 编译、汇编、连接分别指代什么?
  • 关于gcc的汇编
  • linux汇编
  • 关于汇编


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3