Gcc 为什么在x86文档中找不到insl指令

Gcc 为什么在x86文档中找不到insl指令,gcc,assembly,x86,Gcc,Assembly,X86,谁能告诉我下面的方法。我不明白insl的说明 static inline void insl(uint32_t port, void *addr, int cnt) { asm volatile ( "cld;" "repne; insl;" : "=D" (addr), "=c" (cnt) : "d" (port), "0" (addr), "1" (cnt)

谁能告诉我下面的方法。我不明白insl的说明

static inline void
    insl(uint32_t port, void *addr, int cnt) {
        asm volatile (
            "cld;"
            "repne; insl;"
            : "=D" (addr), "=c" (cnt)
            : "d" (port), "0" (addr), "1" (cnt)
            : "memory", "cc");
    }
该函数将从port指定的输入端口将cnt dwords读取到提供的输出数组addr中

insl相当于insd:

GAS语法使用l后缀表示对dword 32位数据进行操作的指令。

该函数将从端口指定的输入端口将cnt dword读取到提供的输出数组addr中

insl相当于insd:


GAS语法使用l后缀表示对dword 32位数据进行操作的指令。

您尝试过搜索该指令吗?互联网上有很多关于x86汇编的参考资料。@Olaf:这是一条指令。在英特尔手册中,它不是insl,而是INSD。手册中没有INSL。我同意EOF的观点,即从检查未设置标志的in/out指令上的标志的角度来看,repne ins没有意义。英特尔的文档说明了一件事,但在多年的实践中,现实是另一回事。假设实际的物理x86处理器确实允许repne on ins指令,但它的行为就像rep一样。我还没有看到物理处理器遇到UD时抛出UD。我见过虚拟机/模拟器抛出异常!最好不要使用它让您的软件在最广泛的环境中工作。我做了一些研究,发现至少在一个有文档记录的环境中出现了一个旧版本的Xen3虚拟环境没有出现故障,但它没有按预期工作。这是由从事NetBSD工作的人发现的:您是否尝试过搜索该指令?互联网上有很多关于x86汇编的参考资料。@Olaf:这是一条指令。在英特尔手册中,它不是insl,而是INSD。手册中没有INSL。我同意EOF的观点,即从检查未设置标志的in/out指令上的标志的角度来看,repne ins没有意义。英特尔的文档说明了一件事,但在多年的实践中,现实是另一回事。假设实际的物理x86处理器确实允许repne on ins指令,但它的行为就像rep一样。我还没有看到物理处理器遇到UD时抛出UD。我见过虚拟机/模拟器抛出异常!最好不要使用它让您的软件在最广泛的环境中工作。我做了一些研究,发现至少在一个有文档记录的环境中出现了一个旧版本的Xen3虚拟环境没有出现故障,但它没有按预期工作。这是从事NetBSD工作的人发现的:为什么insl指令不使用输入参数。与insl%0一样,%1:%2@天心它只是旧x86指令集的遗物。当我们拥有更少的寄存器时,每个寄存器都有自己的预期用途。许多指令使用隐式输入/输出寄存器。。。in/out使用ax和dx,而字符串指令使用si/di。隐式寄存器使操作码更短。非常感谢,我明白了。^^为什么insl指令不使用输入参数。与insl%0一样,%1:%2@天心它只是旧x86指令集的遗物。当我们拥有更少的寄存器时,每个寄存器都有自己的预期用途。许多指令使用隐式输入/输出寄存器。。。in/out使用ax和dx,而字符串指令使用si/di。隐式寄存器使操作码更短。非常感谢,我明白了。^^