【问题标题】:How to add assembly code in Linux如何在 Linux 中添加汇编代码
【发布时间】:2010-10-09 15:55:17
【问题描述】:

我正在 Fedora core 6 上编写一个 Linux 内核模块,我想知道是否有人可以告诉我如何将下面显示的汇编代码添加到我的程序中。汇编代码是为 Windows 编写的,我不知道如何转换为 Linux 内核程序。

#ifdef _MSC_VER

unsigned char lookKbits(char k)
{
    _asm {
        mov dl, k
        mov cl, 16
        sub cl, dl
        mov eax, [wordval]
        shr eax, cl
    }
}

unsigned char WORD_hi_lo(char byte_high, char byte_low)
{
    _asm {
        mov ah,byte_high
        mov al,byte_low
    }
}

#endif

【问题讨论】:

  • 你的问题不是很清楚。这就是内联汇编。
  • 你至少应该给出生成的汇编函数。
  • 我是否应该担心您想将一个构建 WORD 结果的函数放入 eax 但声明为将一个字符返回到 kernel 中?无论您找到什么答案,编译时都应该仔细检查生成的代码是否正确。
  • 是的,我实际上打算将它移植到工作汇编指令中,但这并没有真正的意义。我也遇到了这个讨论(cboard.cprogramming.com/archive/index.php/t-92815.html),这似乎是同一件事。

标签: linux assembly kernel


【解决方案1】:

您是否尝试过用 C 语言编写它?在我天真的眼里,它看起来不需要在汇编程序中。

【讨论】:

  • 主要思想是这些函数在我的程序中会被调用太多次,程序应该尽可能快地执行。
  • 用 C 语言编写确实是个好主意 - 然后您可以分析您的代码并确定是否真的需要程序集版本。
  • 没有程序需要“尽可能快地”执行——大多数程序只需要有限地快速执行——弄清楚它有多快并优化它直到你到达它,然后停止。
【解决方案2】:

GCC Inline Assembly Howto

如果您只是在寻找语法:

基本内联汇编的格式是 非常直截了当。它的基本 形式是

asm("汇编代码");

示例:asm("movl %ecx %eax"); /* 将 ecx 的内容移动到 eax */

具体来说,请查看section 3,它将 Intel 与 AT&T 语法进行比较。

【讨论】:

    【解决方案3】:

    在内核中,您还可以使用__asm__ 宏,示例参见include/asm/atomic.hLXR 是一个非常好的浏览和搜索 Linux 源代码的站点,你会在那里找到很多示例。

    【讨论】:

      【解决方案4】:

      您要问的是如何在 gcc 中编写内联汇编。 gcc 手册的第 5.35 节对此有广泛的信息。但是,对于这个特定的示例,几乎可以肯定,用 C 语言重写这些函数会更好,因为与 asm 语句生成的代码相比,您可能会从编译器中获得更好的代码...

      【讨论】:

        猜你喜欢
        • 2019-08-25
        • 1970-01-01
        • 1970-01-01
        • 2011-09-13
        • 2011-10-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多