strcpy gcc内联汇编代码

Jia*_*hen 5 c assembly gcc 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;
}
Run Code Online (Sandbox Code Playgroud)

bbo*_*nev 4

rsrcrdst用作占位符变量,稍后指示编译器在寄存器中使用SI和对其进行优化DIsrc和 也发生同样的情况dst,但它们被用作汇编代码的输入,而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 
Run Code Online (Sandbox Code Playgroud)

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

如果上述代码应与 DF 无关,则应将其包装如下:

PUSHF
CLD
...
POPF
Run Code Online (Sandbox Code Playgroud)