《汇编: asm函数》

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

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

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

分析下面语句

__asm__("movb %3,%%dh\n\t" \
 "movb %2,%%dl\n\t" \
 "shll $16,%%edx\n\t" \
 "movw %1,%%dx" \
 :"=d" (__base) \
 :"m" (*((addr)+2)), \
 "m" (*((addr)+4)), \
 "m" (*((addr)+7))); \
 __base;})

首先它的基本格式为:

__asm__ ("InstructionList"
                                    :Output
                                    :Input
                                    :Clobber/Modify);

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

%0       __base

%1      (*((addr)+2))

%2      (*((addr)+4))

%3      (*((addr)+7))

这样的占位符最多有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平台上所可能使用的操作约束。

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

常用的寄存器约束的缩写 

约束        意义
r            表示使用一个通用寄存器,由 GCC  在%eax/%ax/%al,%ebx/%bx/%bl,%ecx/%cx/%cl,%edx/%dx/%dl中选取一个GCC认为合适的。
g           表示使用任意一个寄存器,由GCC在所有的可以使用的寄存器中选取一个GCC认为合适的。
q           表示使用一个通用寄存器,和约束r的意义相同。
a           表示使用%eax/%ax/%al
b           表示使用%ebx/%bx/%bl
c           表示使用%ecx/%cx/%cl
d           表示使用%edx/%dx/%dl
D          表示使用%edi/%di
S           表示使用%esi/%si
f            表示使用浮点寄存器
t            表示使用第一个浮点寄存器
u           表示使用第二个浮点寄存器

如果一个Input/Output  操作表达式的C/C++表达式表现为一个内存地址,不想借助于任何寄存器,则可以使用内存约束。比如:

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

修饰符     输入/输出      意义
=                 O               表示此Output操作表达式是Write-Only的。
+                 O               表示此Output操作表达式是Read-Write的。
&                 O               表示此Output操作表达式独占为其指定的寄存器。
%                I                 表示此Input  操作表达式中的C/C++表达式可以和下一 个Input操作表达式中的C/C++表达式互换

  • 9
    点赞
  • 38
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

HarkerYX

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值