Chinaunix首页 | 论坛 | 博客
  • 博客访问: 287715
  • 博文数量: 56
  • 博客积分: 3025
  • 博客等级: 中校
  • 技术积分: 534
  • 用 户 组: 普通用户
  • 注册时间: 2008-08-06 17:28
个人简介

Honesty and diligence should be your eternal mates.

文章分类

全部博文(56)

文章存档

2012年(1)

2011年(27)

2010年(20)

2008年(8)

分类: LINUX

2010-12-08 08:53:56

1、AT&T 与 INTEL 的汇编语言语法的区别:

   * AT&T 汇编代码使用小写字母
   * AT&T 汇编代码的指令格式是 指令 源操作数 目的操作数
   * AT&T 汇编代码的寄存器需要加前缀%,立即数需要加前缀$;符号常数不需要加前缀,若加前缀$表示其
          地址;总线锁定前缀lock,代码加lock前缀表示其他CPU不能访问加锁的内存单元
   * AT&T 汇编代码的远程跳转指令和子过程调用指令加前缀 l
   * AT&T 汇编代码中使用()引用基地址而不是[]
   * AT&T 汇编代码的指令代码最后一位表示操作数的大小:b表示byte;w表示word;l表示long。
   * AT&T 汇编代码的符号扩展后缀为movs,零扩展为movz

2、LinuxC中内嵌汇编代码:

格式: __asm__ __volatile__ ("movl %1,%0":"=r"(result):"m"(input));

"movl %1,%0"为指令模板,冒号后面是每个操作数对应的C表达式(括号的内容)和表达式的说明和限制(引号里的内容)。注意这里的对应顺序不同,冒号后第一项对应的是%0,第二项对应的是%1。

对于引号内的内容说明:
   =r : 表示result是输出操作数,r表示将result和某个寄存器相关联,我们对result操作的时候,实际上操作的是寄存器,而操作完成后将寄存器的值写回到result。m表示操作数放在内存,而不是寄存器中。

这样我们再看看上篇博文中用到的汇编代码:

asm volatile ("movl %%cr0, %%eax":"=a"(cr0)); 

输入部分为空,也就是我们可以直接从cr0寄存器中取数;输出部分为cr0变量,a表示将cr0和eax相关联。这句话执行完后,cr0寄存器中的值就赋给了变量cr0。

asm volatile ("movl %%eax, %%cr0": :"a"(cr0));

输出部分为空,我们直接将结果输出到cr0寄存器。输入部分为变量cr0,它和eax寄存器相关联。这句话执行完后,变量cr0的值赋给了寄存器cr0。

阅读(1180) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~