Gcc 混淆内联汇编

Gcc 混淆内联汇编,gcc,x86,inline-assembly,att,osdev,Gcc,X86,Inline Assembly,Att,Osdev,嘿,伙计们,当我阅读代码时,我对这个代码片段感到有点困惑。我是说cnt看起来像一个循环计数器,为什么它不直接存储到ECX中,而是使用“1”作为输入约束。看来我们可以多存一个寄存器了。我是这个领域的新手,如果我犯了任何新手错误,请多给我几步。干杯。1表示使用与操作数1相同的位置,即=c(cnt),因此它是ecx。也可以直接使用c,或读写操作数。相同的结果,不同的语法。哇,我正忙着找出哪个奇怪的架构有trepne和tinsw指令。伙计,我现在觉得有点像鹅了:-)只要用“+D”(addr),“+c”(

嘿,伙计们,当我阅读代码时,我对这个代码片段感到有点困惑。我是说cnt看起来像一个循环计数器,为什么它不直接存储到ECX中,而是使用“1”作为输入约束。看来我们可以多存一个寄存器了。我是这个领域的新手,如果我犯了任何新手错误,请多给我几步。干杯。

1
表示使用与操作数
1
相同的位置,即
=c(cnt)
,因此它是
ecx
。也可以直接使用
c
,或读写操作数。相同的结果,不同的语法。哇,我正忙着找出哪个奇怪的架构有
trepne
tinsw
指令。伙计,我现在觉得有点像鹅了:-)只要用
“+D”(addr),“+c”(cnt)
;RMW操作数比匹配约束简单,这是一个包装函数,因此可以修改这些C变量。不管怎样,您都可以将它们用作输出。您不能“保存寄存器”;隐式使用3个寄存器;它们都必须在输入时设置。我建议使用
作为分隔符,而不是
\n\t
,以确保INSN之间的可读性。您可能希望将指令分隔为它们自己的字符串文本,如:
“cld”\n\t“repne”\n\t“insw”
,如果您想在列表中的多行上显示它们。@thebusybe,如果多行不是那么重要,用分号分隔它们通常更清晰:
cld;repne insw
1
表示使用与操作数
1
相同的位置,即
=c(cnt)
,因此它是
ecx
。也可以直接使用
c
,或读写操作数。相同的结果,不同的语法。哇,我正忙着找出哪个奇怪的架构有
trepne
tinsw
指令。伙计,我现在觉得有点像鹅了:-)只要用
“+D”(addr),“+c”(cnt)
;RMW操作数比匹配约束简单,这是一个包装函数,因此可以修改这些C变量。不管怎样,您都可以将它们用作输出。您不能“保存寄存器”;隐式使用3个寄存器;它们都必须在输入时设置。我建议使用
作为分隔符,而不是
\n\t
,以确保INSN之间的可读性。您可能希望将指令分隔为它们自己的字符串文本,如:
“cld”\n\t“repne”\n\t“insw”
,如果您想在列表中的多行上显示它们。@thebusybe,如果多行不是那么重要,用分号分隔它们通常更清晰:
cld;报告工程师
static inline void
insw(int port, void *addr, int cnt)
{
    asm volatile("cld\n\trepne\n\tinsw"
             : "=D" (addr), "=c" (cnt)
             : "d" (port), "0" (addr), "1" (cnt)
             : "memory", "cc");
}