我想将C的outb函数移植到D。

static __inline void outb (unsigned char value, unsigned short int port)
{
    __asm__ __volatile__ ("outb %b0,%w1"
                          :
                          :
                         "a" (value),
                          "Nd" (port));
}

这是D版本。
extern(C)
{
    void outb (ubyte value, ushort port)
    {
        // I couldn't figure out this part
   }

}

这些是有关该主题的一些链接。

D内联汇编器

http://dlang.org/iasm.html

GCC内联汇编HOWTO

http://ibiblio.org/gferg/ldp/GCC-Inline-Assembly-HOWTO.html

但是我不懂汇编语言,所以我需要一些帮助。任何帮助,将不胜感激。谢谢。

最佳答案

outb指令仅应被称为outb %al, %dx,其中%al是值,而%dx是端口。

D使用x86的Intel语法,而GNU汇编器默认使用AT&T语法。相应的Intel语法为out dx, al,D中的相应代码如下所示:

void outb (ubyte value, ushort port)
{
    asm {
        mov AL, value;
        mov DX, port;
        out DX, AL;
    }
}

请注意,您根本不需要编写程序集,因为druntime具有执行相同指令的 core.bitop.outp 函数。
void outb (ubyte value, ushort port)
{
    import core.bitop;
    outp(port, value);
}

关于转换帮助: __asm__ __volatile__,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8614721/

10-11 23:03
查看更多