zoukankan      html  css  js  c++  java
  • linux源码阅读笔记 asm函数

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

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

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

    分析下面语句

    __asm__("movb %3,%%dh "
     "movb %2,%%dl "
     "shll $16,%%edx "
     "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 "

         ::"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++表达式互换

  • 相关阅读:
    UE4 学习 噩梦项目
    字符串学习笔记
    luogu P4391 [BOI2009]Radio Transmission 无线传输
    luogu P2153 [SDOI2009]晨跑
    网络流学习笔记
    UVA437 【巴比伦塔 The Tower of Babylon】
    基础重修笔记
    luogu P1283 【平板涂色】
    树链剖分学习笔记
    DP学习笔记
  • 原文地址:https://www.cnblogs.com/elnino/p/4313340.html
Copyright © 2011-2022 走看看