《汇编: asm函数》

匿名 (未验证) 提交于 2019-12-03 00:03:02

在linux源码中经常遇到__asm__函数。它其实是函数asm的宏定义

#define __asm__ asm,asm函数让系统执行汇编语句。

__asm__常常与__volatile__一起出现。__volatile__限制编译器不能对下面的汇编语句进行优化处理。

分析下面语句

 

首先它的基本格式为:

 

%0,%1,%2,%3分别对应OutPut和Input中出现的操作数,称为占位符。在此例中,对应关系如下:

这样的占位符最多有10个。在操作数之前还有一个字符串,该字符串表示将操作数放入对应的位置进行处理。

例如,"=d" (__base),表示将操作数__base放入寄存器%edx。也就是%edx代表了__base,=表示该操作数是WRITE―ONLY的。

而"m"表示内存。这就是所谓的操作约束。

注意,如果操作约束是“m“,也就是内存的话。无论是输入参数还是输出参数,对这些参数的改变会反映在内存中。

例如:

 int c=0;  __asm__("mov $100,%0\n\t"\       ::"m" c)

c的值会被改变为100

具体的寄存器缩写以及各个符号的含义见下。

每一个Input和Output表达式都必须指定自己的操作约束Operation Constraint,这里将讨论在80386平台上所可能使用的操作约束。

当前的输入或输出需要借助一个寄存器时,需要为其指定一个寄存器约束,可以直接指定一个寄存器的名字。













 __asm__("lidt%0":"=m"(__idt_addr)); __asm__("lidt%0"::"m"(__idt_addr));





标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!