CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
可用分押宝游戏火热进行中... 专题改版:Java Web 专题
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  Linux/Unix社区 >  程序开发区

linux下汇编的问题

楼主thinp(孤类)2004-12-04 17:25:43 在 Linux/Unix社区 / 程序开发区 提问

我想编一个程序,主程序是用g++写的,里面有几个函数我想用汇编写,然后让C++的函数中来调用它,不知道该如何写?主要是汇编部分怎么写,谁有例子代码,对了,函数是有传入参数的 问题点数:0、回复次数:6Top

1 楼tianxiangyuan(潇湘夜雨)回复于 2004-12-04 18:43:54 得分 0

在Linux内核中有例子Top

2 楼wwwunix(木易)回复于 2004-12-05 13:14:37 得分 0

Linux中用的是AT&T汇编:  
  at&t汇编语法简单说明  
   
  这些是从网上的一些资料整理而得,不知道说清楚了没有,或是有什么错误,请指正。  
   
  1:寄存器引用  
  引用寄存器要在寄存器号前加%,如   mov   %   eax,   %   ebx    
   
  2:   操作数顺序  
  操作数排列是从源(左)到目的(右),如  
  mov   %   eax(源),   %   ebx(目的)  
   
  3:   常数/立即数的格式    
  使用立即数,要在数前面加   $,   如   mov   $4   ,   %   ebx  
  符号常数直接引用   如   mov   value   ,   %   ebx   (value是一常数,已在前面定义)  
  引用符号地址在符号前加   $,   如   mov   $value,   %   ebx   (是将value的地址放到ebx中)  
   
  4:操作数的长度  
  操作数的长度用加在指令后的符号表示  
  b(byte),   w(word),   l(long)   如   movw   %ax,%bx    
   
  5:寻址方式    
  内存寻址可以用  
  section:disp(base,   index,   scale)   表示,计算方法是    
  base   +   index*scale   +   disp,   section在实模式下有用,保护模式下用线性地址,不用section。  
  例如:  
  call   *SYMBOL_NAME(sys_call_table)(,%   eax,4)  
  这是entry.S中的一句,对应应该是  
  %   eax*4   +   sys_call_table,   在sys_call_table中找到相应系统调用的地址。  
   
   
  二 基本的行内汇编    
   
  基本的行内汇编很简单,一般是按照下面的格式    
  asm("statements");    
  例如:asm("nop");   asm("cli");    
  asm 和 __asm__是完全一样的.    
  如果有多行汇编,则每一行都要加上 "\n\t"    
  例如:    
  asm(   "pushl   %   eax\n\t"    
  "movl   $0,%   eax\n\t"    
  "popl   %   eax");    
  实际上gcc在处理汇编时,是要把asm(...)的内容"打印"到汇编    
  文件中,所以格式控制字符是必要的.    
   
  再例如:    
  asm("movl   %   eax,%   ebx");    
  asm("xorl   %   ebx,%   edx");    
  asm("movl   $0,_booga);    
   
  在上面的例子中,由于我们在行内汇编中改变了edx和ebx的值,但是    
  由于gcc的特殊的处理方法,即先形成汇编文件,再交给GAS去汇编,    
  所以GAS并不知道我们已经改变了edx和ebx的值,如果程序的上下文    
  需要edx或ebx作暂存,这样就会引起严重的后果.对于变量_booga也    
  存在一样的问题.为了解决这个问题,就要用到扩展的行内汇编语法.    
   
  三 扩展的行内汇编    
  基本的格式是:    
  asm(   statements   :   outputs   :   inputs   :   registers-modified);    
  statements是一些汇编语句,outputs是输出寄存器,inputs是输入寄存器,registers-modified  
  是在这个过程中改变的寄存器。  
  例如:  
   
  int   i=0,   j=1,   k=0;  
  __asm__   __volatile__("  
  pushl   %%   eax\n  
  movl   %1,   %%   eax\n  
  addl   %2,   %%   eax\n  
  movl   %%   eax,   %0\n  
  popl   %%   eax"  
  :   "=g"   (k)  
  :   "g"   (i),   "g"   (j)  
  );   //   k   =   i   +   j  
   
  在上面的这段代码中,输入寄存器用了"g"限定符,它的意思是将输入变量放入  
  eax,ebx,ecx,edx或内存变量其中之一,类似的限定还有:  
  "a"   eax    
  "b"   ebx    
  "c"   ecx    
  "d"   edx    
  "S"   esi    
  "D"   edi    
  "q"   从eax,ebx,ecx,edx分配寄存器  
  "r"   从eax,ebx,ecx,edx,esi,edi分配寄存器  
  "g"   eax,ebx,ecx,edx或内存变量    
  "A"   把eax和edx合成一个64位的寄存器(use   long   longs)    
  "I"   I是常数值,例如"1",它是把输出寄存器和输入寄存器由左到右,由上到下顺序往下数对应的寄存器  
  在上面这段代码中,%0对应k存放的寄存器,,%1对应i存放的寄存器,%2对应j存放的寄存器.  
  "i"   立即数  
  "m"   内存变量  
  输出寄存器要在前面加"=",指示输出的位置。  
  上面的代码展开大概是:  
  mov   i,   %   eax  
  mov   j,   %   ebx  
  pushl   %%   eax  
  movl   %   eax,   %%   eax  
  movl   %   ebx,   %%   eax  
  movl   %%   eax,   %   ecx  
  popl   %%   eax  
   
  又如:  
  do   {   \  
  int   __d0,   __d1;   \  
  __asm__   __volatile__   ("movw   %%dx,%%ax\n\t"   \  
  "movw   %4,%%dx\n\t"   \  
  "movl   %%   eax,%0\n\t"   \  
  "movl   %%   edx,%1"   \  
  :"=m"   (*((long   *)   (gate_addr))),   \  
  "=m"   (*(1+(long   *)   (gate_addr))),   "=&a"   (__d0),   "=&d"   (__d1)   \  
  :"i"   ((short)   (0x8000+(dpl<<13)+(type<<8))),   \  
  "3"   ((char   *)   (addr)),"2"   (__KERNEL_CS   <<   16));   \  
  }   while   (0)中    
  %3   对应edx,   %2对应eax,   %1是(*(1+(long   *)   (gate_addr))).   这段代码是将中断处理函数的地址填到  
  ldt(中断向量表)中。Top

3 楼ahwgm(菜鹰)回复于 2004-12-05 13:19:32 得分 0

不懂......Top

4 楼thinp(孤类)回复于 2004-12-06 14:11:21 得分 0

wwwunix(木易)   ,C中用汇编是可以,不过不方便,特别是有变量输入输出时,当程序大时,单单看变量就让人头痛得不得了Top

5 楼wwwunix(木易)回复于 2004-12-06 15:59:26 得分 0

To   thinp(孤类):  
  你想怎么做呢?Top

6 楼thinp(孤类)回复于 2005-01-07 12:45:07 得分 0

我想直接用汇编来写,函数,然后直接在C中调用汇编中的函数Top

相关问题

  • linux 下的汇编
  • 有谁知道linux下的反汇编?
  • win2000下DOS汇编
  • 怎样在linux下编译汇编程序?
  • 找nasm,或其他linux下汇编工具。我想给分!!!
  • 请问linux 下的C如何嵌入汇编代码?
  • 有谁知道那里有LINUX下的汇编工具啊?
  • 那里有linux下汇编的资料?谢谢!
  • linux下的汇编问题(关于中断调用)
  • linux 下有没有类似masm的汇编语言编译器?

关键词

  • 汇编
  • asm
  • 函数
  • 寄存器
  • 操作数
  • ebx
  • 常数
  • 引用
  • 符号
  • 格式

得分解答快速导航

  • 帖主:thinp

相关链接

  • CSDN Blog
  • 技术文档
  • 代码下载
  • 第二书店
  • 读书频道

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
世纪乐知(北京)网络技术有限公司 版权所有, 京 ICP 证 020026 号
北京创新乐知广告有限公司 提供技术支持
Copyright © 2000-2007, CSDN.NET, All Rights Reserved
GongshangLogo