我想将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/