strcpy gcc内联汇编代码

时间:2014-02-08 04:11:30

标签: c gcc assembly inline-assembly

有谁可以告诉我这两个变量int rsrc, rdst;的作用是什么?或者通过声明向我解释以下代码?

static inline char * asm_strcpy(char *dst, char *src) {
    int rsrc, rdst;
    __asm__ __volatile__(
        "1: \tlodsb\n\t;"
        "stosb\n\t;"
        "testb %%al,%%al\n\t;"
        "jne 1b;"
        : "=&S" (rsrc), "=&D" (rdst)
        : "0" (src),"1" (dst) 
        );
    return dst;
}

1 个答案:

答案 0 :(得分:3)

rsrcrdst用作占位符变量,稍后指示编译器使用SIDI在寄存器中优化它们。 srcdst也是如此,但它们被用作汇编代码的输入,而rsrcrdst则是其丢弃的输出。

汇编代码非常简单:

1:
  lodsb ; loads byte at *SI to register AL, increments SI
  stosb ; stores byte at *DI from register AL, increments DI
  testb AL,AL ; sets flags based on value in AL
  jne 1: ; repeat if AL is non zero 

要使所有这些操作正确,方向标志应清晰;没有经验法则,因为它可能取决于调用约定,或者可以在整个程序中自由修改

如果上面的代码应该与DF无关,那么下面应该包装它:

PUSHF
CLD
...
POPF