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。
阅读(1294) | 评论(0) | 转发(0) |