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